- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 C 中使用了以下宏:
#define test_bit(_n,_p) !! ( _n & ( 1u << _p))
我研究过宏,但我需要确定宏中双重否定的使用,以及它与宏定义的行为有何不同:
#define test_bit(_n,_p) ( _n & ( 1u << _p))
最佳答案
想想当你测试一个特定位时会发生什么:
1111 1111 (0xff)
& 0000 0100 (0x04, bit 2)
---- ----
= 0000 0100 (0x04)
如果您这样保留它,您的结果将是位掩码本身。
现在考虑对它的双重(逻辑上的,而不是按位的)否定,这不与什么都不做相同:
first: !4 -> 0
then: !0 -> 1
换句话说,!!4
给你1
而不是 4
这保证你会得到一个 0/1
真值而不是 0/whatever-the-bitmask-was
值(value)。
下面的程序展示了这一点:
#include <stdio.h>
#define test_bit0(_n,_p) (_n & (1u << _p))
#define test_bit1(_n,_p) !!(_n & (1u << _p))
int main (void) {
printf ("%d %d\n", test_bit0 (0xff, 2), test_bit1 (0xff,2));
return 0;
}
它输出:
4 1
正如预期的那样。
Aside: there are precious few places where you would write code like that nowadays since modern compilers are more than up to the task of inlining code automatically, and choosing the most efficient way to do an operation like
((_n & (1u << _p)) != 0)
.And don't get me started on the use of obtuse variable names, the use of
number
andposition
delivers far more in readability that it loses in compile time :-)
关于c - 关于 C 中 test_bit 宏的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7470761/
我正在尝试通过 ioctl() 读取 Linux 设备的输入,我看到了许多带有“test_bit”宏的代码示例,但我发现的唯一代码是:#define test_bit(bit, array) (arr
我在 C 中使用了以下宏: #define test_bit(_n,_p) !! ( _n & ( 1u 0 then: !0 -> 1 换句话说,!!4给你1而不是 4这保证你会得到
我是一名优秀的程序员,十分优秀!