我试图在C中编写一个获取字节(char)和索引的宏,然后从该字节读取index
位。
这就是我得到的:
#define READBIT(byte, index) (byte) & (1 << (index))
这就是我检查它的方式:
for (i = 7; i >= 0; i--)
{
printf("%d", READBIT('a', i));
}
打印0643200001
。
为什么它不起作用,我该如何解决?
答案 0 :(得分:5)
#define READBIT(byte, index) (((unsigned)(byte) >> (index)) & 1)
注意为无符号值更好地定义>>
和<<
。
答案 1 :(得分:0)
这个问题是前一段时间被问过的,我从评论中看到有人删除了他们的答案,这些答案可能已经解决了“为什么不工作”OP问题的一部分。我会加2美分
它正在工作,而不是你对它的期望,它归结为移位运算符的使用。 'a'的十进制值为97或'0110 0001'为二进制。你的宏
#define READBIT(byte, index) (byte) & (1 << (index))
取1并将其移位左某个数字(7到0)并执行一元和对'a'的二进制,例如:
if index = 7 then '0110 0001' & '1000 000' which is '0000 0000' or 0
if index = 6 then '0110 0001' & '0100 000' which is '0100 0000' or 64
if index = 5 then '0110 0001' & '0010 000' which is '0010 0000' or 32
依此类推,确实这就是你的输出所显示的内容。要按照预期产生1和0并且正如在另一个答案中正确指出的那样,你真的想要将字节右移位一些数字(7到0)并对1执行一元操作像这样
#define READBIT(byte, index) (((byte) >> (index)) & 1)
然后我们会得到
v------>v
if index = 7 then '0110 0001' shifted right 7 becomes '0000 0000'
and '0000 0000' & '0000 0001' is '0000 0000' or 0
v----->v
if index = 6 then '0110 0001' shifted right 6 becomes '0000 0001'
and '0000 0001' & '0000 0001' is '0000 0001' or 1
v---->v
if index = 5 then '0110 0001' shifted right 5 becomes '0000 0011'
and '0000 0011' & '0000 0001' is '0000 0001' or 1
等等。
或者,可以通过向结果添加“!= 0”来修复原始宏,然后返回true(1)或false(0)。然后原始宏看起来像
#define READBIT(byte, index) ((byte) & (1 << (index)) != 0)
希望这对将来的某些人有所帮助。