gpt4 book ai didi

c - 关于 C 中 test_bit 宏的问题

转载 作者:太空狗 更新时间:2023-10-29 15:47:02 25 4
gpt4 key购买 nike

我在 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 and position delivers far more in readability that it loses in compile time :-)

关于c - 关于 C 中 test_bit 宏的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7470761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com