一个字节和一个整数的按位运算

Bitwise Operation on a byte and an int

我有一个表示为

的字节数组
char * bytes = getbytes(object); //some api function

我想检查某个位置 x 的位是否已设置。

我一直在尝试这个

int mask = 1 << x % 8;
y= bytes[x>>3] & mask;

然而 y return 全部为零?我做错了什么,有没有更简单的方法来检查是否设置了位?

编辑:

我也这样做了运行。它也没有 return 预期的结果。

  int k = x >> 3;
   int mask = x % 8;
    unsigned char byte = bytes[k];
   return (byte & mask);

它未能通过 assert true ctest I 运行。从 gdb 打印时,此时字节和掩码分别为“0002”和 2。

编辑 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;

这将是我头脑中的一种(可能是粗略的)方式:

#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)。