我要实现这样的功能:

int read_single_bit(unsigned char* buffer, unsigned int index)


其中index是我想读取的位的偏移量。

如何使用移位或屏蔽来实现此目的?

最佳答案

buffer[index/8] & (1u<<(index%8))


应该执行此操作(即,将buffer查看为位数组并测试index处的位)。

类似地:

buffer[index/8] |= (1u<<(index%8))


应该将index-th位置1。

或者,您可以针对该表存储1和&的八个移位状态的表

unsigned char bits[] = { 1u<<0, 1u<<1, 1u<<2, 1u<<3, 1u<<4, 1u<<5, 1u<<6, 1u<<7 };


如果您的编译器没有将这些/%优化为位操作(更有效),则:

 unsigned_int / 8  == unsigned_int >> 3
 unsigned_int % 8  == unsigned_int & 0x07  //0x07 == 0000 0111


所以

 buffer[index>>3] & (1u<<(index&0x07u))  //test
 buffer[index>>3] |= (1u<<(index&0x07u)) //set

关于c - 从char缓冲区读取一点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35373034/

10-12 16:05