用于阅读的宏不起作用

时间:2014-07-10 18:42:21

标签: c macros

我试图在C中编写一个获取字节(char)和索引的宏,然后从该字节读取index位。 这就是我得到的:

#define READBIT(byte, index) (byte) & (1 << (index))

这就是我检查它的方式:

for (i = 7; i >= 0; i--)
{
    printf("%d", READBIT('a', i));
}

打印0643200001

为什么它不起作用,我该如何解决?

2 个答案:

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

希望这对将来的某些人有所帮助。