#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
