c程序产生输出2为什么? #包括 int main() { int x=0,y=2; int z=~x&y; printf(“%d\n”,z); }

c程序产生输出2为什么? #包括 int main() { int x=0,y=2; int z=~x&y; printf(“%d\n”,z); },c,bit-manipulation,C,Bit Manipulation,任何人都能告诉操作是如何进行的,变量是如何保存在内存中的吗?理解操作符~是关键,请注意~操作符与not操作符不同 x=0 ~x=0xFFFFFFFF y=0x00000002 z=0xFFFFFF&0x00000002 z=0x2 按位补码 按位补码运算符,即波浪形符号~,翻转每一位。记住这一点的一个有用方法是,tilde有时被称为旋转,按位补码旋转每一位:如果你有一个1,它是一个0,如果你有一个0,它是一个1 要了解有关位运算符的更多信息,请访问此部分。了解运算符~是关键,请注意~运算符与非运

任何人都能告诉操作是如何进行的,变量是如何保存在内存中的吗?

理解操作符
~
是关键,请注意
~
操作符与
not
操作符不同

x=0

~x=0xFFFFFFFF

y=0x00000002

z=0xFFFFFF&0x00000002

z=0x2

按位补码

按位补码运算符,即波浪形符号~,翻转每一位。记住这一点的一个有用方法是,tilde有时被称为旋转,按位补码旋转每一位:如果你有一个1,它是一个0,如果你有一个0,它是一个1


要了解有关位运算符的更多信息,请访问此部分。

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

x=0

~x=0xFFFFFFFF

y=0x00000002

z=0xFFFFFF&0x00000002

z=0x2

按位补码

按位补码运算符,即波浪形符号~,翻转每一位。记住这一点的一个有用方法是,tilde有时被称为旋转,按位补码旋转每一位:如果你有一个1,它是一个0,如果你有一个0,它是一个1


要了解有关逐位运算符的更多信息,请访问此项。

让我仅使用8位将其缩短:

#include <stdio.h>
int main()
{
    int x = 0, y = 2;
    int z = ~x & y;
    printf("%d\n", z);
}
然后,例如,
011b&001b
将导致
001b
(因为两个操作数中只有LSB是
1
)。在求反
x
(即
0
)的情况下,您将32位设置为
1
,因此结果将完全取决于
y
(因为
1和RHS=RHS
,请参见真值表中的最后两行)


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

让我仅使用8位将其缩短:

#include <stdio.h>
int main()
{
    int x = 0, y = 2;
    int z = ~x & y;
    printf("%d\n", z);
}
然后,例如,
011b&001b
将导致
001b
(因为两个操作数中只有LSB是
1
)。在求反
x
(即
0
)的情况下,您将32位设置为
1
,因此结果将完全取决于
y
(因为
1和RHS=RHS
,请参见真值表中的最后两行)


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

我将使用binairy解释原因

lhs rhs lhs AND rhs 0 0 0 0 1 0 1 0 0 1 1 1 现在,
~x
x
相反,所以
1111
&
执行位加密,(
&&
执行逻辑and),因此:

0010
为2


注意:我使用的是4位,但实际上,根据实现情况,这可能是32位(或16位)。这个想法还是一样的

我将用binairy来解释原因

lhs rhs lhs AND rhs 0 0 0 0 1 0 1 0 0 1 1 1 现在,
~x
x
相反,所以
1111
&
执行位加密,(
&&
执行逻辑and),因此:

0010
为2


注意:我使用的是4位,但实际上,根据实现情况,这可能是32位(或16位)。这个想法仍然是一样的

为了这个例子,我将使用无符号整数,这样我们将更容易地计算二进制方法

如果整数
x
为0,则其值为
00000000000000000000000000
(32位-每个位为0)

现在,当你说
~x
时,你的意思是补码
x
,它翻转所有的位-每个打开的位现在都会关闭,每个关闭的位都会打开。意味着X现在将是
11111111111111111
(32位-每一位为1)

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

~x & y
1111 & 0010
0010

依此类推。

为了便于示例,我将使用无符号整数,以便更容易地计算二进制方式

如果整数
x
为0,则其值为
00000000000000000000000000
(32位-每个位为0)

现在,当你说
~x
时,你的意思是补码
x
,它翻转所有的位-每个打开的位现在都会关闭,每个关闭的位都会打开。意味着X现在将是
11111111111111111
(32位-每一位为1)

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

~x & y
1111 & 0010
0010

以此类推。

如今,int
的宽度通常为32位。但是:有趣的是,位的数量是完全无关紧要的——这适用于任何整数类型。
int
现在通常是32位宽。但是:有趣的是,位的数量是完全无关紧要的——这将适用于任何整数类型。@请再澄清一点,下面两个数字将如何保存在机器unsigned int k=-4中;int k=-4@mps只需再澄清一点,下面两个数字将如何保存在机器unsigned int k=-4中;int k=-4;