自定义Bitmap

使用场景

Bitmap 是一种使用 位数组(bit array) 来表示数据的结构,每一位(bit)表示一个值的状态。由于每个位只占用 1 bit,因此Bitmap 的存储效率非常高,特别适用于大数据去重、标记布尔值状态、稀疏数据存储 等场景。

含义

Bitmap 的核心思想是用 位(bit) 来标记状态。
假设我们有一个整数数组需要存储 0 到 N-1 的数字,我们可以用位图来表示这些数字是否存在:
第 0 位 表示数字 0 是否存在
第 1 位 表示数字 1 是否存在
第 N 位 表示数字 N 是否存在

前置知识

我们先来看看Java中的基本数据类型占用的字节数量
占用的字节数

实现

public class Bitmap {
    private final byte[] bits;


    public Bitmap(int size) {
        bits = new byte[(size + 7) / 8];
    }

    // 设置第pos位为1
    public void set(int pos) {
        int index = pos / 8;           // 找到对应的byte索引
        int offset = pos % 8;          // 找到byte内的位偏移
        bits[index] |=  (1 << offset);  // 设置对应位为1
    }

    // 清除第pos位为0
    public void clear(int pos) {
        int index = pos / 8;           // 找到对应的byte索引
        int offset = pos % 8;          // 找到byte内的位偏移
        bits[index] &=  ~(1 << offset); // 将对应位清0
    }

    // 检查第pos位是否为1
    public boolean get(int pos) {
        int index = pos / 8;           // 找到对应的byte索引
        int offset = pos % 8;          // 找到byte内的位偏移
        return (bits[index] & (1 << offset)) != 0;
    }

    // 打印Bitmap的内容
    public void print() {
        for (int i = 0; i < bits.length; i++) {
            // 打印二进制字符串,前面补足 0
            String binaryString = String.format("%8s", Integer.toBinaryString(bits[i] & 0xFF)).replace(' ', '0');
            System.out.print(binaryString + " ");
        }
        System.out.println();
    }

测试

public class TestBitmap {
    @Test
    public void test() {

        Bitmap bitmap = new Bitmap(64);
        System.out.println("init:");
        bitmap.print();

        // 设置位
        bitmap.set(0);
        bitmap.set(10);
        bitmap.set(63);

        // 打印Bitmap
        System.out.println("After setting bits:");
        bitmap.print();

        // 清除位
        bitmap.clear(10);
        System.out.println("After clearing bit 10:");
        bitmap.print();

        // 检查位
        System.out.println("Is bit 0 set? " + bitmap.get(0));
        System.out.println("Is bit 10 set? " + bitmap.get(10));
        System.out.println("Is bit 63 set? " + bitmap.get(63));
    }
}

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949022.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公司资产网站

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

第431场周赛:最长乘积等价子数组、计算字符串的镜像分数、收集连续 K 个袋子可以获得的最多硬币数量、不重叠区间的最大得分

Q1、最长乘积等价子数组 1、题目描述 给你一个由 正整数 组成的数组 nums。 如果一个数组 arr 满足 prod(arr) lcm(arr) * gcd(arr)&#xff0c;则称其为 乘积等价数组 &#xff0c;其中&#xff1a; prod(arr) 表示 arr 中所有元素的乘积。gcd(arr) 表示 arr 中所有元素的…

掌握RabbitMQ:全面知识点汇总与实践指南

前言 RabbitMQ 是基于 AMQP 高级消息队列协议的消息队列技术。 特点&#xff1a;它通过发布/订阅模型&#xff0c;实现了服务间的高度解耦。因为消费者不需要确保提供者的存在。 作用&#xff1a;服务间异步通信&#xff1b;顺序消费&#xff1b;定时任务&#xff1b;请求削…

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题&#xff0c;以及解决方案&#xff0c;原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览&#xff1a; …

SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)

文章目录 目录了解自动配置 一、导入对应场景的Mean依赖&#xff1a;1、引入依赖**找到自动配置类的所有配置都存放在哪里** 二、编写主程序&#xff1a;SpringBootApplication观察源码时所需要知道的几个核心注解&#xff1a;1、观察SpringBootApplication源码都做了什么 三、…

【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动

终极解读《沉默的羔羊》&#xff1a;弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支&#xff0c;主要关注人类行为背后的无意识动机和冲突。…

字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题

字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题 字玩FontPlayer是笔者开源的一款字体设计工具&#xff0c;使用Vue3 ElementUI开发&#xff0c;源代码&#xff1a; github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontpl…

javaEE-网络编程-3 UDP

目录 Socaket套接字 UDP数据报套字节编程 1.DatagrameSocket类 DatagramSocaket构造方法: DatagramSocaket常用方法&#xff1a; 2.DatagramPacket类 DatagramPacket构造方法&#xff1a; UDP回显服务器实现 UDP服务端实现&#xff1a; 创建一个Socket类对象&#xf…

Linux:操作系统不朽的传说

操作系统是计算机的灵魂&#xff0c;它掌控着计算机的硬件和软件资源&#xff0c;为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中&#xff0c;Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…

模拟出一个三维表面生成表面点,计算体积,并处理边界点

python代码 生成表面点,计算体积,并处理边界点,最终模拟出一个三维表面。 步骤: 初始参数设置: initial_fixed_point:一个初始固定点的坐标。 slop_thre:坡度阈值。 v_thre:体积阈值。 slope_rad:将坡度从度转换为弧度。 step_size:步长。 lam_x, lam_y:泊松分布的…

STM32拓展 低功耗案例1:睡眠模式 (register)

需求描述 让MCU进入睡眠模式&#xff0c;然后通过串口发送消息来唤醒MCU退出睡眠模式。观察LED在进入休眠模式后是否仍然开启。 思考 首先睡眠模式&#xff0c;唤醒的条件是中断&#xff0c;外部内部都可以&#xff0c;这里的串口接收中断时内部中断。 拓展&#xff1a;中断…

vue 基础参数增加多语言配置

js 对数组的增删改查 字段在数据库存储为nvarchar &#xff0c;varchar存储波斯语会乱码 数组格式&#xff1a; {"en": [{"type": "10","value": "Confirm","color": ""},{"type": "…

[桌面运维]windows自动设置浅深色主题

设置自动浅色/深色主题 我看很多up主的教程过于繁琐&#xff0c;需要添加四个功能&#xff0c;并且有些还不能生效&#xff01; 大多数都是教程&#xff1a; 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…

基于Python的考研学习系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…

Yocto 项目中的包管理系统详细解析

1. 包管理系统概念 包管理系统是用于管理软件包的工具和机制&#xff0c;包括创建、分发和安装软件包。Yocto 项目支持以下三种主要的包管理系统及其相关包格式&#xff1a; IPK (Itsy Package System)&#xff1a;适合轻量级嵌入式应用&#xff0c;通过 OPKG 管理。RPM (Red…

RISC-V学习笔记

1.RISC ISA1个基本整数指令集多个可选的扩展指令集&#xff0c;如RV32I表示支持32位整数指令集。I表示基本指令集&#xff0c;M表示整数乘法与除法指令集&#xff0c;A表示存储器原子指令集&#xff0c;F表示单精度浮点指令集&#xff0c;D表示双精度浮点指令集等&#xff0c;C…

第四届计算机、人工智能与控制工程

第四届计算机、人工智能与控制工程 The 4th International Conference on Computer, Artificial Intelligence and Control Engineering 重要信息 大会官网&#xff1a;www.ic-caice.net 大会时间&#xff1a;2025年1月10-12日 大会地点&#xff1a;中国合肥 (安徽大学磬苑…

Docker安装易有云(casaos安装易有云)

无法拉取易有云&DDNSTO Docker镜像&#xff1f; 官方视频 Docker方式安装易有云&#xff0c;包括并不限于Unraid/爱快/群晖等&#xff0c;只要有Docker的设备都成&#xff0c;包括一些Linux发行版等。 铁威马&#xff1a;首先在应用中心里安装Docker(TOS 4.0及更高的系统…