0

Suppose I have a bitmap like this:

sizeofBitmapInBits = 16; // must be multiple of 8
char* bitmap = new char[sizeofBitmapInBits/8](); // 2 bytes

And I want to toggle a single bit of this bitmap, let's say bit n° 11.

Is this correct?

int numBit = 11;
int posBitmap = floor(numBit / 8); // this gives me the byte in the bitmap
char ch = bitmap[posBitmap];

int positionInByte = numBit - posBitmap * 8 ; // this gives me the bit in the byte
ch |= 1 << positionInByte; // or ch |= 0 << positionInByte
bitmap[posBitmap] = ch;
4

3 回答 3

3

它看起来基本上是正确的,但它比它需要的要复杂一些。我要做的唯一技术更改是使用unsigned char而不是char. 除此之外,您不需要floor,并且可以%用来计算位偏移:

int index = numBit / 8;
int offset = numBit % 8;
bitmap[offset] |= 1 << offset;

正如@graygoose124 指出的那样,它会打开一点,但不会关闭它。要切换它,请替换|=^=。更一般地,使用

bitmap[index] |= 1 << offset;

打开一点,和

bitmap[index] &= ~(1 << offset);

关掉一点,和

bitmap[index] ^= 1 << offset;

切换一下。

于 2013-04-24T17:58:20.653 回答
1

为了让它比@Pete Becker 回答更简单,为什么不使用 bitset(http://www.cplusplus.com/reference/bitset/bitset/):

#include <bitset>
std::bitset<16> bitmap;

int numBit = 11;
bitmap.flip(numBit);
于 2013-04-24T18:13:09.167 回答
1

我做了一个简短的忽略,除了|=. (虽然,我觉得它可以更容易地完成)

目前,您的代码将打开一点,但如果您尝试将其关闭,则不会发生任何事情。( 1 | 1 = 1, 1 | 0 = 1)

相反,您应该使用^=, 因为1 ^ 1 = 00 ^ 1 = 1.

于 2013-04-24T17:55:45.637 回答