关于Bitwise运算符

时间:2016-06-20 00:19:37

标签: c

if((x & 1) == 0)
    printf("EVEN!\n");
else
    printf("ODD!\n");

为什么X&1在数字为奇数时总会给出1。我的意思是在这个操作期间内存中发生的事情可以解释一下吗?

3 个答案:

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