c++ 如何從數組中讀取個別位?




c++ bitmask type (5)

你需要在這裡操作...

if(array[5] & 0x1)
{
//the first bit in array[5] is 1
}
else
{
//the first bit is 0
}

if(array[5] & 0x8)
{
//the 4th bit in array[5] is 1
}
else
{
//the 4th bit is 0
}

二進制0x8是00001000。 做的和所有其他位掩碼,並讓你看看是否是1或0。

int通常是32位,所以你需要做一些算術運算來獲得整個數組中的某個位數。

比方說,我有一個動態分配的數組。

int* array=new int[10]

即10 * 4 = 40字節或10 * 32 = 320位。 我想讀取第30個字節或第242個位的第二位。 最簡單的方法是什麼? 我知道我可以使用數組[30]訪問第30個字節,但訪問個別位更加棘手。


Answer #1

首先,如果你正在進行按位運算,通常最好使元素成為無符號的整型(儘管在這種情況下,它確實沒有太大的區別)。 至於訪問位:訪問位在一個n int的數組我:

static int const bitsPerWord = sizeof(int) * CHAR_BIT;
assert( i >= 0 && i < n * bitsPerWord );
int wordIndex = i / bitsPerWord;
int bitIndex = i % bitsPerWord;

然後閱讀:

return (array[wordIndex] & (1 << bitIndex)) != 0;

設置:

array[wordIndex] |= 1 << bitIndex;

並重置:

array[wordIndex] &= ~(1 << bitIndex);

或者你可以使用bitset(如果n是常量),或者如果不是,則可以使用vector<bool>boost::dynamic_bitset ,並讓別人去做。


Answer #2

這是工作!

#define GET_BIT(p, n) ((((unsigned char *)p)[n/8] >> (n%8)) & 0x01)

int main()
{
    int myArray[2] = { 0xaaaaaaaa, 0x00ff00ff };
    for( int i =0 ; i < 2*32 ; i++ )
        printf("%d", GET_BIT(myArray, i));
    return 0;
}

輸出:

0101010101010101010101010101010111111111000000001111111100000000

要小心endiannes!


Answer #3
bool bitset(void const * data, int bitindex) {
  int byte = bitindex / 8;
  int bit = bitindex % 8;
  unsigned char const * u = (unsigned char const *) data;
  return (u[byte] & (1<<bit)) != 0;
}

Answer #4

EDITED基於下面的註釋 - 數組包含32位的int,而不是8位uchar。

int pos = 241; // I start at index 0
bool bit242 = (array[pos/32] >> (pos%32)) & 1;




binary