c程序导致输出2为什么?

时间:2014-08-01 09:41:04

标签: c bit-manipulation

#include <stdio.h>
int main()
{
    int x = 0, y = 2;
    int z = ~x & y;
    printf("%d\n", z);
}

任何正文都可以告诉关于变量如何保存在内存中的操作方式

4 个答案:

答案 0 :(得分:8)

让我用8位来缩短它:

x         0   00000000
y         2   00000010
~x       -1   11111111
~x & y    2   00000010

按位补码~将补充(反转值)其操作数的每个位(1变为00变为1)。如果它的两个操作数中有&,则按位与1会将位设置为1

lhs    rhs    lhs AND rhs
 0      0          0   
 0      1          0   
 1      0          0   
 1      1          1   

然后,例如,011b & 001b将导致001b(因为两个操作数中只有LSB为1)。在您的情况下,否定x0)您将32位设置为1,因此结果将完全取决于y(因为1 AND RHS = RHS,请参阅最后一位真值表中有两行。

重要提示:请注意,您的代码不可移植,根据ANSI C,有符号整数的AND行为是实现定义的(因此在您的实现中有效的方法可能会在另一个实现中被破坏)平台/编译器或其他编译器版本。)

答案 1 :(得分:4)

我会用binairy来解释原因

int x = 0;      //x = 0000
int y = 2;      //y = 0010
int z = ~x & y;

现在,~x反复x所以1111 &做了一个小小的尝试,(&&做了逻辑和)所以:

~x & y
1111 & 0010
0010

0010是2

注意:我使用的是4位,但事实上根据实现情况,这可能是32位(或16位)。这个想法保持不变

答案 2 :(得分:2)

了解运算符~是关键,请注意~运算符与NOT运算符不同。

x = 0

~x = 0xFFFFFFFF

y = 0x00000002;

z = 0xFFFFFFFF&amp; 0x00000002;

z = 0x2;

按位补充

按位补码运算符,波浪号,〜,翻转每一位。记住这个问题的一个有用的方法是,波形符号有时被称为旋转,并且按位补码会使每一位都变得尖锐:如果你有一个1,它就是0,如果你有一个0,它就是1。

要了解有关按位运算符的更多信息,请访问此tutorial

答案 3 :(得分:2)

为了示例,我使用无符号整数,因此我们将更容易计算二进制方式。

如果整数x为0,则其值为00000000000000000000000000000000(32位 - 每一位为0)。

现在,当你说~x你的意思是补全x翻转所有的比特 - 开启的每个比特现在都将关闭,每个关闭的比特都会打开。方法X现在是11111111111111111111111111111111(32位 - 每一位是1)。

这是无符号整数可以包含的最大值。当你对一个只有1的数字的所有位使用按位AND时,结果将是第二个数字。 例子:

1 & 0 is 0.
11 & 01 is 01.
111 & 001 is 001
111111111111 & 00100101 is 00100101

等等。