gpt4 book ai didi

按位语句的说明

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:55 25 4
gpt4 key购买 nike

以下条件 if(a & (a-1)/2) 在 C 中是什么意思?

#include <stdio.h>

int main()
{
int a;
scanf("%d", &a);

if(a & (a-1)/2)
{
printf("Yes\n");
}
else{
printf("No\n");
}
return 0;
}

这里没看懂/运算符的意思。条件中的除法运算符是什么意思?

最佳答案

除法运算符/简单地将左侧除以右侧。在这种情况下,右侧是 2,因此它正在移动 a-1右移一位(算术移位,对整数进行符号扩展)。

因此整个表达式计算 - 对于 a>=0 - 是否a((a-1)>>1)两者都设置了任何相同的位(在这种情况下 & 将产生一个非零值)。对于 a<0看到最后的评论。

下面是一些测试代码:

#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char **argv)
{
int i;
for (i = 0; i < 256; i++)
{
printf ("%3d %s\n", i, (i & (i - 1) / 2) ? "yes" : "no");
}
exit (0);
}

给出

  0 no
1 no
2 no
3 yes
4 no
5 no
6 yes
7 yes
8 no
9 no
10 no
11 yes
12 yes
13 yes
14 yes
15 yes
16 no
17 no
18 no
19 yes
20 no
21 no
22 yes
23 yes
24 yes
25 yes
26 yes
27 yes
28 yes
29 yes
30 yes
31 yes
32 no
33 no
34 no
... abbreviated for clarity ...

这会检测以下任一数字:

  • 有两个或多个相邻的二进制 1 或;

  • 是负数,但不是 MININT .

方法如下:

  • 如果 a>=0 , 然后 (a-1)/2 == a/2 (因为四舍五入总是趋向于零)。所以这相当于(对于 a>=0 ) a & (a>>1)如果 a 中任何位右边的位将是一个是否设置,即如果有两个或多个相邻的。

  • 如果 a<0a!=MININT , (因此有 1 作为它的 MSB),然后是 (a-1)也必须为负且小于 -1 , 所以 (a-1)/2也必须为负数(因此将 1 作为其 MSB),在这种情况下 a & ((a-1)/2))是非零的,因为它的 MSB 也必须是 1。

  • 如果 a==MININT , 然后 a-1MAXINT , 所以 (a-1)/2 没有位都是 1。

关于按位语句的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987640/

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