为什么相同的十六进制值的异或和减法会得到相同的结果?
例如:
7A - 20 = 5A
7A XOR 20 = 5A
当然,使用不同的值也会产生相同的效果。为什么会出现这种情况呢?
For example:
7A - 20 = 5A
7A XOR 20 = 5A
Of course, this will work the same using different values. Why does this occur exactly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只有在没有借用的情况下才一样,
即任何位位置都没有
0 - 1
,只有1-0 = 1
或1-1 = 0
。这相当于说第一个操作数(被减数)在第二个操作数(减数)所做的任何地方都设置了位。
即如果
x & y == y
,然后xy == x^y
。最简单的反例:
0 - 1 = 0xFF
- 借位一直传播到寄存器的顶部。0 ^ 1 = 0x01
- XOR 是无进位加法,它只是翻转一个操作数中设置了另一个操作数中的位的位。 (即,您可以将其视为翻转1
中的任何位,留下1
。或者翻转0
中的低位,产生1
。)XOR 是可交换的(
x ^ y == y ^ x
),减法不是(xy
通常与yx< /code>,除了特殊情况的结果,例如
0
或0x80
)使用相同的值重复 XOR 可将其撤消,例如
5A ^ 20 = 7A
会将该位翻转回来。但重复减法则不会:
5A - 20 = 3A
。It's only the same if there are no borrows,
i.e. no
0 - 1
at any bit-positions, only1-0 = 1
or1-1 = 0
.That's the same as saying that the first operand (the minuend) has set bits everywhere the second operand (subtrahend) does.
i.e. if
x & y == y
, thenx-y == x^y
.The simplest counter-example:
0 - 1 = 0xFF
- borrow propagates all the way to the top of the register.0 ^ 1 = 0x01
- XOR is add-without-carry, it just flips the bits in one operand where a bit is set in the other operand. (i.e. you could look at it as flipping no bits in1
, leaving1
. Or as flipping the low bit in0
, producing1
.)XOR is commutative (
x ^ y == y ^ x
), subtraction is not (x-y
is usually different fromy-x
, except for special-case results like0
or0x80
)Repeating XOR with the same value undoes it, e.g.
5A ^ 20 = 7A
flips the bit back on.But repeating subtraction doesn't:
5A - 20 = 3A
.