【发布时间】:2016-09-27 23:32:48
【问题描述】:
我正在学习 C 中的屏蔽技术。 这是我正在处理的一个练习题: 需要找到 0x87654321 的补码,同时保持最低有效字节完整,看起来应该像这样 0x789ABC21
我现在熟悉的唯一掩码是使用 x & 0xFF 去除除最后一个字节之外的所有内容。我不知道使用哪个位运算符来获得十六进制数的补码。我该如何处理?
我的书没有解释十六进制数的补码是什么,但我搜索了一下,发现确定一个补码的快捷方法是取 15 - hexDigit = 补码如果我错了,请纠正我。
【问题讨论】:
-
0x87654321U ^ 0xFFFFFF00U -
为什么这会产生补语?
-
因为 XOR 是布尔“不等于”函数。当我们将某个值 X 与布尔值 1/True(X XOR True)进行异或时,我们说的是“X 不等于 True”,这与“X not True”相同,“X not True”只是“not X”,它是补码。 C ^ 运算符在操作数的所有相应位上并行应用布尔 XOR 函数。所以我们可以使用像 0xFFFFFF00 这样的 mask 来选择我们想要补充的位。与 0 进行异或运算什么都不做; X XOR 0 是 X。XOR-ing 与 1 翻转 1 到 0 和 0 到 1..