if((x & 1) == 0)
printf("EVEN!\n");
else
printf("ODD!\n");
为什么X&1
在数字为奇数时总会给出1
。我的意思是在这个操作期间内存中发生的事情可以解释一下吗?
答案 0 :(得分:0)
二进制中的每个奇数都设置了最低位。而且X & 1
总是测试那一点。因此,检查总是正确的。
如果您不明白为什么第一个陈述为真,那么只需将几个十进制数转换为二进制数就应该清楚。
1 == 00000001b
3 == 00000011b
5 == 00000101b
7 == 00000111b
etc
然后,为了确保,对一些偶数进行相同操作以验证最低位是否始终为0:
2 == 00000010b
4 == 00000100b
6 == 00000110b
8 == 00001000b
etc
答案 1 :(得分:0)
这是因为二进制数。每个二进制数是2到某个数的幂的集合。如果您要查找4位数,则只有奇数是1(2的幂为0)。如果您正在寻找例如12的数字,那么它是二进制表示1100.当您将掩码设为1时,它看起来像这样
1100
&0001
0000
如果你选择一个奇数,例如3,你有
0011
&0001
0001
如您所见,只有二进制数的最后一位是奇数,1是00000001。
答案 2 :(得分:0)
无论平台上的sizeof(int)
是什么,设置为1
的所有位代表的数字0
除了最低有效位(设置为1
)。让我们采用最常见的表示形式 - 一个32位数字。在这样的平台上,1
是:
00000000 00000000 00000000 00000001
如果对1
执行任何其他数字的按位AND运算,除最低有效位之外的所有位将始终为0
。结果的最低有效位1
的唯一时间是另一个数字的最低有效位也是1
。
这些数字是:
00000000 00000000 00000000 00000001, which is 1
00000000 00000000 00000000 00000011, which is 3
00000000 00000000 00000000 00000101, which is 5
00000000 00000000 00000000 00000111, which is 7
等等。从模式中可以看出,所有奇数的最低有效位是1
。所有偶数的最低有效位是0
。因此,
x & 1 is 1 for all odd values of x
x & 1 is 0 for all even values of x