假设我有一个动态分配的数组。
int* array=new int[10]
这是10 * 4 = 40字节或10 * 32 = 320位。我想要读取第30个字节或第242位的第二位。最简单的方法是什么?我知道可以使用array[30]访问第30个字节,但访问单个位有点棘手。
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;
}
这个正常工作!
#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
小心字节序!
首先,如果你正在进行位运算,通常最好将元素设置为无符号整数类型(尽管在这种情况下,它并没有太大的区别)。至于访问位:要访问n个int数组中的第i位:
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
,如果它不是常量,并让其他人来完成这项工作。
!((array[30] & 2) == 0)
array[30] 是整数。
& 2 是按位与运算,用于屏蔽第二位(2 = 00000010)。
== 0 将检查掩码结果是否为0。
! 将否定该结果,因为我们正在检查它是否为1而不是零....
这里需要位运算...
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位,因此您需要进行一些算术运算才能获取整个数组中的某个特定位数。
根据下面的评论进行编辑 - 数组包含32位整数,而不是8位uchar。
int pos = 241; // I start at index 0
bool bit242 = (array[pos/32] >> (pos%32)) & 1;
/8
和%8
。 - Erik
std::bitset
适合您的需求。 - Oleg Svechkarenkouint8_t
类型的数据。否则,机器数据大小和字节顺序可能会导致问题。 - edA-qa mort-ora-y