#include <stdio.h>
int main()
{
int x = 0, y = 2;
int z = ~x & y;
printf("%d\n", z);
}
任何正文都可以告诉关于变量如何保存在内存中的操作方式
答案 0 :(得分:8)
让我用8位来缩短它:
x 0 00000000 y 2 00000010 ~x -1 11111111 ~x & y 2 00000010
按位补码~
将补充(反转值)其操作数的每个位(1
变为0
而0
变为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
)。在您的情况下,否定x
(0
)您将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
等等。