我正在学习按位操作,我遇到了xor操作,
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",10 ^ 9);
getch();
return 0;
}
二进制形式10 ---&gt; 1 0 1 0 二进制形式9 ---&gt; 1 0 0 1
因此,在XOR中,当其中一个输入为1而另一个输入为0时,输出为1.
因此10 ^ 9的输出是0 0 1 1 =&gt; 3
因此,在尝试-10 ^ 9时,我将输出设为-1。
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",-10 ^ 9);
getch();
return 0;
}
有人能解释我是怎么回事-1?
提前感谢所有帮助过的人!
答案 0 :(得分:6)
因为XOR的运算符优先级低于一元减号。
也就是说,-10 ^ 9
等于(-10) ^ 9
-10 ^ 9
不等于-(10 ^ 9)
。
-10是11110110 (2),9是00001001 (2)。
11110110 (2) XOR 00001001 (2) = 11111111 (2)
11111111 (2)在2的补码表示中为-1。
答案 1 :(得分:2)
继续发表评论。
在双补码系统中,负值由符号扩展的值表示为该类型的宽度。其中ROOT_DIR := $(abspath $(ROOT_DIR))
为10
二进制,{4}整数的1010
的双补码表示为:
-10
(其无符号值为11111111111111111111111111110110
)
现在您看到当4294967286
与xor
(二进制9
),
1001
结果为 11111111111111111111111111110110
^ 1001
----------------------------------
11111111111111111111111111111111 (-1 for a signed integer)
,其符号扩展为32位,或1111
为签名11111111111111111111111111111111
,即int
。
答案 2 :(得分:1)
负数的二进制表示使用名为two's complement的概念。基本上,每个位都先翻转然后再加1。
例如,8位表示正10将是00001010
。要制作-10,首先翻转位:11110101
,然后添加1:11110101 + 1 = 11110110
。
因此-10的二进制表示是11110110
如果你用9对这个值进行异或,它看起来就像这样:11110110 XOR 00001001 = 11111111
。
11111111
是1的两个补码,因此最终的答案是-1。
答案 3 :(得分:0)
减号' - '符号的优先级高于xor'^'运算符。所以首先我们找到-10的值。
10的二进制当量是1010&amp;以8位表示的表示变为0000 1010。
对于签名号码,我们采用10的2的补码。 首先找到1的补充0000 1010
'static
现在通过添加1合1的补码结果找到2的补码。
eval()
现在执行-10 ^ 9(当两个位不同时,XOR运算符给出1,否则它给出0)
0000 1010 ----- 1's complement ---- 1111 0101
-10 ^ 9 = 1111 1111,等于有符号数字中的-1。
这就是为什么输出变为-1。