如何使用按位C操作找到0x87654321的补码?
问题描述:
我正在学习有关C. 这里屏蔽技术是一个实践问题,我的工作: 需要找到0×87654321的补充,同时留下至少显著字节完整应该是这样的0x789ABC21如何使用按位C操作找到0x87654321的补码?
唯一的面具我现在熟悉的是使用0x& 0xFF来除去最后一个字节。我不知道使用哪个按位运算符来获得十六进制数的补码。我如何解决这个问题?
我的书没有解释一个十六进制数的补码是什么,但我GOOGLE了,发现确定一个补码的捷径方法是采取15 - hexDigit =补充请纠正我,如果我错了。
答
C中的逐位补码运算符是波形码~
。这会以位模式翻转每一位。
按位异或运算符(^
)也可用于执行按位补码。按位XOR真值表低于:特别是
^| 0 1
------
0| 0 1
1| 1 0
注意1^0 = 1和一个1^1 = 0。因此,按位XOR与一个也将有翻转的位的影响。
因此,与0xFFFFFF00
按位异或将翻转数字的最后八位。
'0x87654321U^0xFFFFFF00U' – Kaz
为什么会产生补码? – ixbo45
因为XOR是布尔“不等于”函数。当我们对一个布尔值1 /真(X XOR True)XOR某个值X时,我们说“X不等于真”,这与“X不是真”是相同的,而不是X是补充。 C ^运算符在操作数的所有相应位上并行应用布尔XOR函数。所以我们可以使用0xFFFFFF00这样的* mask *来选择我们想要补充的位。与0异或不做任何事; X XOR 0是X.异或与1翻转1到0和0到1 .. – Kaz