似乎对于给定整数 n 及其掩码 k 的普通整数(按位运算)(一个字节:1111 1111 表示负数,0000 0000 表示正数)
(n ^ K) - K = (n + K) ^ K
这通常用于计算以 K 为掩码的数 n 的绝对值。我的问题是:为什么上述表达有效?为什么这两个术语是等价的?
似乎对于给定整数 n 及其掩码 k 的普通整数(按位运算)(一个字节:1111 1111 表示负数,0000 0000 表示正数)
(n ^ K) - K = (n + K) ^ K
这通常用于计算以 K 为掩码的数 n 的绝对值。我的问题是:为什么上述表达有效?为什么这两个术语是等价的?
您似乎只对 k 的 2 个值感兴趣:0 和 -1。
对于 k=0: (n^0)-0=(n+0)^0
,好的。
对于 k=-1,由于n^-1==~n
,这重写为~n+1=~(n-1)
,尝试在两边添加 n-1 并注意 n+~n==-1。
我认为那不是真的。为了
(n ^ k) - k = (n + k) ^ k =>
((n ^ k) - k) ^ k) = (n + k) ^ k ^k =>
(n ^ k) ^ k - k ^ k = n + k => ### WRONG
n ^ k - 0 = n + k =>
n ^ k = n + k =>
n & k = 0
这是等式的前提。
编辑
我犯了一个错误,即 xor 不能通过减法分配。(a - b) ^ c = a ^ c - b ^ c
是错的!
k = ~0
和存在整数溢出n + k
。因此,它会导致未定义的行为。