Linux内核中这些实现的区别

时间:2017-03-30 03:49:43

标签: linux-kernel

在Linux内核代码中,我可以看到扩展为

的宏
(1<<0)

这意味着什么?我们可以直接在那个地方使用1为什么(1 <&lt; 0)?

基本上

之间有什么区别
(AVIVO_D1CRTC_CONTROL & (1<<0))

(AVIVO_D1CRTC_CONTROL & (1))

2 个答案:

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

编辑:因为我搞砸了手动位移......第二次编辑我第一次就把它弄好了。