对字节和int的按位运算

时间:2017-07-04 04:28:53

标签: c bit-manipulation bitwise-operators bit

我有一个表示为

的字节数组
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;

1 个答案:

答案 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)。