【Cpp】位图Bitmap

news2024/11/24 19:39:37
  • code
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdint.h>

class Bitmap
{
private:
    std::vector<uint8_t> data; // 存储位图数据的字节数组
    uint32_t size;             // 位图的大小(以位为单位)

public:
    // 构造函数
    Bitmap(uint32_t size) : size(size)
    {
        uint32_t byteSize = (size + 7) / 8;
        data.resize(byteSize, 0); // 初始化数据为0
    }

    // 设置或清除指定位的值
    int setBit(uint32_t pos, bool value)
    {
        if (pos < 0 || pos >= size)
        {
            std::cerr << "Invalid bit position: " << pos << std::endl;
            return -1;
        }

        int bytePos = pos / 8;
        int bitPos = pos % 8;

        if (value)
        {
            data[bytePos] |= (1 << bitPos); // 设置为1
        }
        else
        {
            data[bytePos] &= ~(1 << bitPos); // 清除为0
        }

        return 0;
    }

    // 检查指定位是否为1
    bool getBit(uint32_t pos) const
    {
        if (pos < 0 || pos >= size)
        {
            std::cerr << "Invalid bit position: " << pos << std::endl;
            return 0;
        }

        int bytePos = pos / 8;
        int bitPos = pos % 8;
        return (data[bytePos] & (1 << bitPos)) != 0;
    }

    // 打印位图的每一位
    void printBitmap(void)
    {
        printf("Bitmap :\n");
        for (int i = 0; i < size; i++)
        {
            printf(" %.2d:%d |", i, getBit(i));
            if ((0 == ((i + 1) % 8)) && (0 != i))
            {
                printf("\n");
            }
        }
        printf("\n");
    }

    // 读取数据从位图的指定字节起始位置
    int readData(uint32_t startByte, uint8_t *data, uint32_t dataSize) const
    {
        uint32_t bitmapByteSize = (size + 7) / 8;

        if (startByte < 0 || (startByte + dataSize) > bitmapByteSize)
        {
            std::cerr << "Invalid start byte position or data size: " << startByte << std::endl;
            return -1;
        }

        for (uint32_t i = 0; i < dataSize; i++)
        {
            uint32_t bytePos = startByte + i;
            data[i] = this->data[bytePos];
            std::cout << "readData bytePos [" << bytePos << "] data[" << (int)data[i] << "]" << std::endl;
        }

        return 0;
    }

    // 写入数据到位图的指定字节起始位置
    int writeData(uint32_t startByte, const uint8_t *data, uint32_t dataSize)
    {
        uint32_t bitmapByteSize = (size + 7) / 8;

        if (startByte < 0 || (startByte + dataSize) > bitmapByteSize)
        {
            std::cerr << "Invalid start byte position or data size: " << startByte << std::endl;
            return -1;
        }

        for (uint32_t i = 0; i < dataSize; i++)
        {
            uint32_t bytePos = startByte + i;
            this->data[bytePos] = data[i];
            std::cout << "writeData bytePos [" << bytePos << "] data[" << (int)data[i] << "]" << std::endl;
        }

        return 0;
    }
};

int main()
{
    uint32_t bitmapSize = 32; // 设置位图大小
    Bitmap bitmap(bitmapSize);

    // 设置一些位
    bitmap.setBit(8, true);
    bitmap.setBit(9, true);
    bitmap.setBit(18, true);

    // 打印位图的每一位
    bitmap.printBitmap();

    // 清除位
    bitmap.setBit(18, false);
    std::cout << "Bit 18 is set after clearing: " << bitmap.getBit(18) << std::endl;

    // 打印位图的每一位
    bitmap.printBitmap();

    uint8_t dateRead = 0;
    bitmap.readData(1, &dateRead, sizeof(dateRead));
    std::cout << "dateRead [" << (int)dateRead << "]" << std::endl;

    uint8_t dateWrite = 0xFF;
    bitmap.writeData(0, &dateWrite, sizeof(dateWrite));
    bitmap.printBitmap();

    return 0;
}

  • test在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合aop,实现日志操作

前言&#xff1a; 整合之前&#xff0c;我们要明白aop是什么&#xff0c;为什么要用aop&#xff0c;aop能帮我们做什么。 答&#xff1a;AOP是面向切面编程&#xff08;Aspect-Oriented Programming&#xff09;的简称&#xff0c;它是一种编程思想&#xff0c;旨在在面向对象…

【AI视野·今日Sound 声学论文速览 第十期】Fri, 22 Sep 2023

AI视野今日CS.Sound 声学论文速览 Fri, 22 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Performance Conditioning for Diffusion-Based Multi-Instrument Music Synthesis Authors Ben Maman, Johannes Zeitler, Meinard M lle…

数据库中的DDL与DML

标签&#xff1a;数据库 记录下DDL和DML的相关概念。 数据定义语言 定义数据库模式 数据定义语言DDL(Data-Definition Language)可定义数据库模式。数据库模式在之前的文章中已经提到过了。简单来说&#xff0c;建表用的SQL语句就是DDL。如下代码 CREATE TABLE department(de…

使用Python做一个微信机器人

介绍 简介 该程序将微信的内部功能提取出来&#xff0c;然后在程序里加载Python&#xff0c;接着将这些功能导出成库函数&#xff0c;就可以在Python里使用这些函数 程序启动的时候会执行py_code目录下的main.py&#xff0c;类似于你在命令行使用python main.py。 现在会以…

用《斗破苍穹》的视角打开C#多线程开发1(斗帝之路)

Thread.Start() 是的&#xff0c;我就是乌坦城那个斗之气三段的落魄少爷&#xff0c;在我捡到那个色眯眯的老爷爷后&#xff0c;斗气终于开始增长了。在各种软磨硬泡下&#xff0c;我终于学会了我人生中的第一个黄阶斗技——吸掌。 using System.Threading;namespace Framewo…

第一部分:HTML5

一&#xff1a;网页 1.1&#xff1a;什么是网页&#xff1f; 网站是指在因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合 网页是网站中的一"页"&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读 网页是构成网…

透视俄乌网络战之四:西方科技巨头的力量

透视俄乌网络战之一&#xff1a;数据擦除软件 透视俄乌网络战之二&#xff1a;Conti勒索软件集团&#xff08;上&#xff09; 透视俄乌网络战之三&#xff1a;Conti勒索软件集团&#xff08;下&#xff09; 西方科技巨头的力量 1. Palantir2. SpaceX3. Maxar Technologies4. Cl…

送水订水小程序商城的作用是什么?

桶/瓶装水有很高的市场需求度&#xff0c;除了家庭外&#xff0c;部分办公场几乎每天都会订水且有一定的合作&#xff0c;由于没有空间限制&#xff0c;因此对桶装水商家来说&#xff0c;本地和外地客户都有较高的拓展度&#xff0c;而传统电话、微信私信订购宣传方式低效且不智…

10.5 串联型稳压电路(1)

稳压管稳压电路输出电流较小&#xff0c;输出电压不可调&#xff0c;不能满足很多场合下的应用。串联型稳压电路以稳压管稳压电路为基础&#xff0c;利用晶体管的电流放大作用&#xff0c;增大负载电流&#xff1b;在电路中引入深度电压负反馈使输出电压稳定&#xff1b;并且&a…

ElasticSearch - 分布式搜索引擎底层实现——倒排索引

目录 一、ElasticSearch 1.1、ElasticSearch 是什么&#xff1f; 1.2、ElasticStack 是什么? 1.3、正向索引和倒排索引 1.3.1、正向索引 1.3.2、倒排索引 a&#xff09;倒排索引的创建过程&#xff1a; b&#xff09;倒排索引的查询过程&#xff1a; c&#xff09;分…

三、初识FreeRTOS之FreeRTOS基础知识

从这节开始&#xff0c;我们正式学习FreeRTOS的一些基础知识&#xff0c;争取做到日更&#xff0c;或者隔日更。如果在学习的过程中哪里有理解错误&#xff0c;希望各位朋友批评指正。因为自己觉得图文并茂好像更容易理解一点&#xff0c;所以在博文中加了大量的图片&#xff0…

Tomcat部署、优化、以及操作练习

一.Tomcat的基本介绍 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压

首先打开极海APM32F030x4x6x8xC 用户手册找到VREFINT。 找到内部参考电压 VREFINT为ADC1_IN17通道 使用VREFINT必须使能VREFEN位 初始化ADC代码 void ADC_Init(void) {GPIO_Config_T gpioConfig;ADC_Config_T adcConfig;/* Enable GPIOA clock */RCM_Ena…

Redis学习笔记--002

Redis的JAVA客户端 文章目录 Redis的JAVA客户端一、Redis的Java客户端的种类二、Jedis2.1、使用步骤2.2、Jedis连接池 三、[SpringDataRedis](https://spring.io/projects/spring-data-redis)3.1、介绍3.2、RedisTemplate3.3、SpringDataRedis使用步骤3.4、SpringDataRedis的序…

银行家算法——C语言实现

算法思路 将操作系统看作是银行家&#xff0c;操作系统所拥有的资源就相当于银行家所拥有的资产&#xff0c;进程向操作系统申请资源就相当于资产家向银行贷款&#xff0c;规定资产家在向银行贷款之前&#xff0c;先申明其所贷数额的最大值&#xff0c;申明之后其贷款的数额不…

深度学习-一个简单的深度学习推导

文章目录 前言1.sigmod函数2.sigmoid求导3.损失函数loss4.神经网络1.神经网络结构2.公式表示-正向传播3.梯度计算1.Loss 函数2.梯度1.反向传播第2-3层2.反向传播第1-2层 前言 本章主要推导一个简单的两层神经网络。 其中公式入口【入口】 1.sigmod函数 激活函数我们选择sigmo…

银河麒麟ky10 server sp3下载

下载路径 /操作系统/Kylin-Server-V10-SP3-General-Release-2212-X86_64.iso

(高阶) Redis 7 第15讲 布隆过滤器 BitMap篇

面试题 如何快速准备判断某一数据在海量数据中存在了解布隆过滤器吗安全网址判断,黑名单校验,识别垃圾邮件白名单校验,识别合法用户?理论 由一个初始值都为0的 bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素 设计思想 目的减少内存占用方式不保存数据信…

巨人互动|Facebook海外户Facebook运营工具有哪些?

Facebook是全球最大的社交媒体平台之一&#xff0c;为企业提供了丰富的运营工具和功能&#xff0c;帮助他们在这个庞大的平台上推广、管理和监测他们的业务。下面小编讲一些常用的Facebook运营工具吧&#xff01; 1、Facebook广告管理 Facebook提供了强大的广告管理平台&#…