假设我有一个动态分配的数组。
int* array=new int[10]
即10 * 4 = 40字节或10 * 32 = 320位。我想读取第30个字节或第242个字位的第2位。最简单的方法是什么?我知道我可以使用数组[30]访问第30个字节,但访问各个位更加棘手。
答案 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位,因此您需要进行一些算术以获得整个数组中的某个位数。