0

次のようなビットマップがあるとします。

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

そして、このビットマップの 1 ビット、たとえばビット n° 11 を切り替えたいとします。

これは正しいです?

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の回答よりもさらに簡単にするために、ビットセットを使用しないのはなぜですか(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 = 0ます0 ^ 1 = 1

于 2013-04-24T17:55:45.637 に答える