Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于读取位不工作的宏_C_Macros - Fatal编程技术网

C 用于读取位不工作的宏

C 用于读取位不工作的宏,c,macros,C,Macros,我试图用C编写一个宏,它获取一个字节(char)和一个索引,然后它从该字节中读取索引第位。 这就是我得到的: #define READBIT(byte, index) (byte) & (1 << (index)) 它打印0643200001 为什么它不工作?我该如何修复它 #define READBIT(byte, index) (((unsigned)(byte) >> (index)) & 1) 注意>和 注意到>和这个问题是不久前提出的,我从评

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

#define READBIT(byte, index) (byte) & (1 << (index))
它打印
0643200001

为什么它不工作?我该如何修复它

#define READBIT(byte, index) (((unsigned)(byte) >> (index)) & 1)
注意
>


注意到
>
这个问题是不久前提出的,我从评论中看到,有人删除了他们的答案,这可能解决了老年退休金计划问题中的“为什么不起作用”部分。我再加上2美分

它正在工作,只是不是你所期望的那样,归根结底是轮班操作员的使用'的十进制值为97或二进制的'0110 0001'。你的宏

#define READBIT(byte, index) (byte) & (1 << (index))
以此类推,实际上这就是你的输出所显示的。要按预期生成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)

#define READBIT(byte,index)((byte)和(1这个问题是不久前提出的,我从评论中看到有人删除了他们的答案,这可能解决了OPs问题中的“为什么它不工作”部分。我再加上2美分

它正在工作,但不是您所期望的那样,它可以归结为移位运算符的使用。“a”的十进制值为97或二进制的“0110 0001”。您的宏

#define READBIT(byte, index) (byte) & (1 << (index))
以此类推,这确实是您的输出所显示的。要产生预期的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)

定义读取位(字节,索引)((字节)和(1“a”的第一位是1,所以1将被打印8次抱歉,没有注意到,但现在它仍然不起作用。@Turbulence太好了。我如何更改宏以仅返回
0
1
?@shoham,请参见下面Paul Roub的答案Unno为什么Paul Roub删除了他的答案…我觉得很好!a的第一位是1,因此1将是pri抱歉,我没有注意到,但现在它仍然不起作用。@turbulencetoo我如何更改宏以返回
0
1
?@shoham,请参见下面保罗·鲁布的答案。为什么保罗·鲁布删除了他的答案?我觉得很好!很酷,但为什么这是
#定义可读位(字节,索引)((字节)和(1>(索引))
错了?@shoham:
的优先级高于
&
,因此您需要
#定义读取位(字节,索引)((字节)和1(索引))
。向下掩蔽到位,然后向下移位也可以完成这项工作……尽管这看起来比必要的操作多了一个操作。也许值得注意的是,
>
更好地定义为无符号值。因此
读取位(字节,索引)((无符号int)(字节)>>(索引))&1)
可能更好。我试过使用我的gcc,但至少它们没有编译成相同的指令;但我认为比性能更重要的是可读性。我想说,你的版本更可读。我只是想向Shoham解释一下为什么他的方法不起作用。以及+1,因为提到比特的东西应该(几乎)始终对无符号类型执行此操作(可能将此添加到您的答案中)。很酷,但为什么这
#定义READBIT(byte,index)((byte)和(1>(index))
错误?@shoham:
的优先级高于
&
,所以您需要
#定义READBIT(byte,index)((byte)和1(index))
。向下掩蔽到位,然后向下移位也可以完成这项工作……尽管这看起来比必要的操作多了一个操作。也许值得注意的是,
>
更好地定义为无符号值。因此
读取位(字节,索引)((无符号int)(字节)>>(索引))&1)
可能更好。我试过使用我的gcc,但至少它们没有编译成相同的指令;但我认为比性能更重要的是可读性。我想说,你的版本更可读。我只是想向Shoham解释一下为什么他的方法不起作用。以及+1,因为提到比特的东西应该(几乎)始终对未签名类型执行此操作(可能将此添加到您的答案中)。