C语言中的位异或运算
我正在学习逐位运算,我遇到了一个异或运算C语言中的位异或运算,c,bitwise-operators,C,Bitwise Operators,我正在学习逐位运算,我遇到了一个异或运算 #include<stdio.h> #include<conio.h> int main { printf("%d\n",10 ^ 9); getch(); return 0; } #包括 #包括 int main { printf(“%d\n”,10^9); getch(); 返回0; } 10的二进制形式-->1010 9--->1的二进制形式 所以在异或中,当一个输入为1,另一个为0时,输出为1
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",10 ^ 9);
getch();
return 0;
}
#包括
#包括
int main
{
printf(“%d\n”,10^9);
getch();
返回0;
}
10的二进制形式-->1010
9--->1的二进制形式
所以在异或中,当一个输入为1,另一个为0时,输出为1
所以10^9的输出是01=>3
所以当尝试使用-10^9时,我得到的输出是-1
#include<stdio.h>
#include<conio.h>
int main
{
printf("%d\n",-10 ^ 9);
getch();
return 0;
}
#包括
#包括
int main
{
printf(“%d\n”,-10^9);
getch();
返回0;
}
谁能给我解释一下-1是怎么回事吗
提前感谢所有帮助我们的人 因为XOR的运算符优先级低于一元减号 也就是说,
-10^9
等于(-10)^9
-10^9
不等于-(10^9)
-10是11110110(2),9是00001001(2)
11110110(2)异或00001001(2)=11111111(2)
11111111(2)在2的补码表示法中是-1。负数的二进制表示法使用一个称为的概念。基本上,每一位都是先翻转,然后加1 例如,8位表示正10将是
00001010
。要生成-10,首先翻转位:11110101
,然后添加1:11110101+1=11110110
因此,-10的二进制表示是11110110
如果将该值与9进行异或运算,它将如下所示:11110110 XOR 00001001=11111111
11111111
是两者的1的补码,因此最终答案是-1。继续评论
在2的补码系统中,负值由符号扩展到类型宽度的值表示。如果10
是二进制的1010
,则4字节整数的-10
的两个补码表示为:
11111111111111111111111111110110
(其无符号值为4294967286
)
现在您可以看到使用9
(二进制1001
)执行xor
时会发生什么情况
结果是符号扩展到32位的
1111
,或有符号的int
的11111111111111111
,即-1
减号“-”的优先级高于异或“^”运算符。首先我们找到-10的值
10的二进制等价物是1010,用8位表示就变成了0000 1010
对于有符号的数字,我们取2的10的补数。
首先找到0000 1010的1的补码
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(当两个位不同时,异或运算符给出1,否则给出0)
-10^9=1111111,等于有符号数字中的-1
这就是为什么输出变为-1。您的
-10
符号扩展。(这就是为什么按位操作通常在无符号类型上执行)可能与您期望的答案重复?如果你想要3,你可以使用像<代码>(10 ^ 9)< /C> >的括号,但是我不确定你真正想要做什么。除了它是C语言和帖子有C++之外,它的复制是一个重复的问题,但是答案已经解释了。所以,在问问题之前先搜索!非常感谢你!当然,很乐意帮忙。要在二的恭维系统中从正数转换为负数,只需在正数中使用位反运算(翻转所有位)并添加1
。(为了回去,你只要再做一次)谢谢你的帮助
1's complement --------- 1111 0101
Adding 1 --------- 1
2's complement --------- 1111 0110
-10 ------- 1111 0110
9 ------- 0000 1001
--------------------------
-10^9 ------- 1111 1111