我有一个表示为
的字节数组char * bytes = getbytes(object); //some api function
我想检查某个位置x的位是否已设置。
我一直在尝试这个
int mask = 1 << x % 8;
y= bytes[x>>3] & mask;
然而y全部归零?我做错了什么,是否有更简单的方法来检查是否设置了一个位?
编辑:
我也是这样做的。它没有返回预期的结果。
int k = x >> 3;
int mask = x % 8;
unsigned char byte = bytes[k];
return (byte & mask);
它失败了一个断言真正的ctest我跑了。字节和掩码此时“0002”和2分别从gdb打印时。
编辑2:这是我首先设置位的方式。我只是想编写一个测试来验证它们是否已设置。
unsigned long x = somehash(void* a);
unsigned int mask = 1 << (x % 8);
unsigned int location = x >> 3;
char* filter = getData(ref);
filter[location] |= mask;
答案 0 :(得分:0)
这可能是我头脑中的一种(粗略的):
#include "stdio.h"
#include "stdlib.h"
// this function *changes* the byte array
int getBit(char *b, int bit)
{
int bitToCheck = bit % 8;
b = b + (bitToCheck ? (bit / 8) : (bit / 8 - 1));
if (bitToCheck)
*b = (*b) >> (8 - bitToCheck);
return (*b) & 1;
}
int main(void)
{
char *bytes = calloc(2, 1);
*(bytes + 1)= 5; // writing to the appropiate bits
printf("%d\n", getBit(bytes, 16)); // checking the 16th bit from the left
return 0;
}
假设:
一个字节表示为:
----------------------------------------
| 2^7 | 2^6 | 2^5 | 2^4 | 2^3 |... |
----------------------------------------
最左边的位被认为是位号1,最右边的位被认为是最大位。编号位(2字节对象中的第16位)。
可以覆盖实际的byte
对象(如果不需要,请使用memcpy
)。