【问题标题】:How do I find the complement of 0x87654321 using bitwise C operations?如何使用按位 C 运算找到 0x87654321 的补码?
【发布时间】: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..

标签: c hex bitmask


【解决方案1】:

C 中的按位补码运算符是波浪号~。这会以位模式翻转每一位。

按位异或运算符 (^) 也可用于进行按位补码。按位异或真值表如下:

^| 0 1
------
0| 0 1
1| 1 0

特别注意 1^0 = 1 和 1^1 = 0。因此,与 1 的按位异或也会产生翻转位的效果。

因此,与0xFFFFFF00 的按位异或将翻转除最后八位之外的所有数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多