如何从数组中读取单个位?

时间:2011-03-21 10:11:03

标签: c++ binary

假设我有一个动态分配的数组。

int* array=new int[10]

即10 * 4 = 40字节或10 * 32 = 320位。我想读取第30个字节或第242个字位的第2位。最简单的方法是什么?我知道我可以使用数组[30]访问第30个字节,但访问各个位更加棘手。

6 个答案:

答案 0 :(得分:6)

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;
}

答案 1 :(得分:1)

这是有效的!

#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!

答案 2 :(得分:1)

首先,如果你正在进行按位操作,通常就是这样 最好使元素成为无符号整数类型 (虽然在这种情况下,它确实没有那么多 区别)。至于访问位:访问位中的位i 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如果不是,请让其他人来做 工作

答案 3 :(得分:0)

根据以下评论编辑 - 数组包含32位的int,而不是8位uchar。

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

答案 4 :(得分:0)

您可以使用以下内容:

!((array[30] & 2) == 0)

array [30] 是整数。

<强>&安培; 2 是屏蔽第二位(2 = 00000010)

的操作

== 0 将检查掩码结果是否为0

会否定该结果,因为我们正在检查它是否为1而不是......

答案 5 :(得分:0)

你需要在这里进行位操作......

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。执行anding会屏蔽所有其他位,并允许您查看该位是1还是0。

int通常为32位,因此您需要进行一些算术以获得整个数组中的某个位数。