我要实现这样的功能:
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/