在Linux内核代码中,我可以看到扩展为
的宏(1<<0)
这意味着什么?我们可以直接在那个地方使用1为什么(1 <&lt; 0)?
基本上
之间有什么区别(AVIVO_D1CRTC_CONTROL & (1<<0))
和
(AVIVO_D1CRTC_CONTROL & (1))
答案 0 :(得分:2)
这意味着什么?我们可以直接在那个地方使用1为什么(1 <&lt; 0)?
位移与它所处的布尔表达式一致 这不是算术表达式,并且此文字常量的数值不显着 突出的是传达在该位掩码操作中使用的位数和位位置。
不幸的是,您引用了一个退化的案例,该案例没有证明在数值上使用位移的优势(在逻辑表达式中)。
无可否认,1
比(1 << 0)
更容易输入,阅读和理解
但是现在32位处理器和设备无处不在,更大的寄存器及其位定义&amp;位掩码将涉及两个的高功率
因此,即使每个程序员都应该知道一个字节的比特值(即两个的前八个幂),有多少可以做到同样多达2 ^ 31?
以下哪个宏最容易理解哪个位被定义?
#define AVIVO_CRTC_DISP_READ_REQUEST_DISABLE 16777216
#define AVIVO_CRTC_DISP_READ_REQUEST_DISABLE 0x1000000
#define AVIVO_CRTC_DISP_READ_REQUEST_DISABLE (1 << 24)
设备通过寄存器访问控制和状态位。器件数据表具有寄存器描述,用于映射每个寄存器中的位
现代惯例是从零开始从右到左对寄存器位进行编号(如二进制数中的2的幂)
寄存器中的这些控制和状态位通常由位编号标识,因此在其定义中使用该位编号(使用位移表达式)比将其转换为数值更实用且更有效。
然后,很容易将这些寄存器图与使用位移的位定义的宏相关联。
基本上
之间有什么区别
就生成的目标代码而言:没有区别 对编译器:表达式的宏替换和评估需要大量的额外编译时间 为了代码的可读性和可维护性:位移是首选。
答案 1 :(得分:0)
这是一种风格的东西。
(X & (1<<0)) // And X with a value that has the 0th bit set.
为
扩展得更好(X & (1<<7)) // And X with a value that has the 7th bit set.
副
(X & (1)) // And X with 1.
(X & (128)) // And X with 128. (or 0x80)
编辑:因为我搞砸了手动位移......第二次编辑我第一次就把它弄好了。