#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); }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); }else{data[bytePos] &= ~(1 << bitPos); }return 0;}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
