C中的按位异或运算
Bitwise XOR operation in C
我正在学习按位运算,遇到异或运算,
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",10 ^ 9);
getch();
return 0;
}
10的二进制形式---> 1 0 1 0
9 的二进制形式 ---> 1 0 0 1
所以在 XOR 中,当一个输入为 1 而另一个为 0 时,输出为 1。
所以 10^9 的输出是 0 0 1 1 => 3
所以当尝试 -10 ^ 9 时,我得到的输出是 -1。
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",-10 ^ 9);
getch();
return 0;
}
谁能解释一下 -1 是怎么来的?
在此先感谢所有提供帮助的人!
因为异或的运算符优先级低于一元负
即-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。
负数的二进制表示使用了一个叫做two's complement的概念。基本上,先翻转每一位,然后加 1。
例如,正 10 的 8 位表示将是 00001010
。要得到 -10,首先翻转位:11110101
,然后加 1:11110101 + 1 = 11110110
.
所以-10的二进制表示因此是11110110
如果你将这个值与 9 进行异或,它看起来会像这样:11110110 XOR 00001001 = 11111111
.
11111111
是1的补码,所以最后的答案是-1。
从评论继续。
在二进制补码系统中,负值由 sign-extended 到类型宽度的值表示。 10
在二进制中是 1010
,对于 4 字节整数,-10
的 two-complement 表示是:
11111111111111111111111111110110
(无符号值为 4294967286
)
现在你看到当你 xor
和 9
(二进制 1001
),
时会发生什么
11111111111111111111111111110110
^ 1001
----------------------------------
11111111111111111111111111111111 (-1 for a signed integer)
结果是 1111
,即 sign-extended 到 32 位,或 11111111111111111111111111111111
对于带符号的 int
,即 -1
。
减号“-”的优先级高于异或“^”运算符。所以首先我们求出-10的值。
10 的二进制等价物是 1010 & 以 8 位表示为 0000 1010 。
对于有符号数,我们取 10 的 2 的补码。
先求0000的1的补1010
0000 1010 ----- 1's complement ---- 1111 0101
现在通过在 1 的补码结果中加上 1 来求 2 的补码。
1's complement --------- 1111 0101
Adding 1 --------- 1
2's complement --------- 1111 0110
现在执行 -10^9(当两个位不同时 XOR 运算符给出 1,否则给出 0)
-10 ------- 1111 0110
9 ------- 0000 1001
--------------------------
-10^9 ------- 1111 1111
-10^9 = 1111 1111 等于有符号数中的-1。
这就是输出变为 -1 的原因。
我正在学习按位运算,遇到异或运算,
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",10 ^ 9);
getch();
return 0;
}
10的二进制形式---> 1 0 1 0 9 的二进制形式 ---> 1 0 0 1
所以在 XOR 中,当一个输入为 1 而另一个为 0 时,输出为 1。
所以 10^9 的输出是 0 0 1 1 => 3
所以当尝试 -10 ^ 9 时,我得到的输出是 -1。
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",-10 ^ 9);
getch();
return 0;
}
谁能解释一下 -1 是怎么来的?
在此先感谢所有提供帮助的人!
因为异或的运算符优先级低于一元负
即-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。
负数的二进制表示使用了一个叫做two's complement的概念。基本上,先翻转每一位,然后加 1。
例如,正 10 的 8 位表示将是 00001010
。要得到 -10,首先翻转位:11110101
,然后加 1:11110101 + 1 = 11110110
.
所以-10的二进制表示因此是11110110
如果你将这个值与 9 进行异或,它看起来会像这样:11110110 XOR 00001001 = 11111111
.
11111111
是1的补码,所以最后的答案是-1。
从评论继续。
在二进制补码系统中,负值由 sign-extended 到类型宽度的值表示。 10
在二进制中是 1010
,对于 4 字节整数,-10
的 two-complement 表示是:
11111111111111111111111111110110
(无符号值为 4294967286
)
现在你看到当你 xor
和 9
(二进制 1001
),
11111111111111111111111111110110
^ 1001
----------------------------------
11111111111111111111111111111111 (-1 for a signed integer)
结果是 1111
,即 sign-extended 到 32 位,或 11111111111111111111111111111111
对于带符号的 int
,即 -1
。
减号“-”的优先级高于异或“^”运算符。所以首先我们求出-10的值。
10 的二进制等价物是 1010 & 以 8 位表示为 0000 1010 。
对于有符号数,我们取 10 的 2 的补码。 先求0000的1的补1010
0000 1010 ----- 1's complement ---- 1111 0101
现在通过在 1 的补码结果中加上 1 来求 2 的补码。
1's complement --------- 1111 0101
Adding 1 --------- 1
2's complement --------- 1111 0110
现在执行 -10^9(当两个位不同时 XOR 运算符给出 1,否则给出 0)
-10 ------- 1111 0110
9 ------- 0000 1001
--------------------------
-10^9 ------- 1111 1111
-10^9 = 1111 1111 等于有符号数中的-1。
这就是输出变为 -1 的原因。