Algorithm 位交换算法中的位掩码
在完全理解一个基本算法时有点困难,该算法接受一个数字x并在位置i和j交换位。这个算法就是众所周知的Algorithm 位交换算法中的位掩码,algorithm,binary,Algorithm,Binary,在完全理解一个基本算法时有点困难,该算法接受一个数字x并在位置i和j交换位。这个算法就是众所周知的 def swap_bits(x, i, j): if (x >> i) & 1 != (x >> j) & 1: bit_mask = (1 << i) | (1 << j) x ^= bit_mask return x def交换位(x,i,j): 如果(x>>i)&1!=(x>>j
def swap_bits(x, i, j):
if (x >> i) & 1 != (x >> j) & 1:
bit_mask = (1 << i) | (1 << j)
x ^= bit_mask
return x
def交换位(x,i,j):
如果(x>>i)&1!=(x>>j)和1:
bit_mask=(1你最初的直觉认为有些东西看起来可疑是正确的。有一个输入错误:
> def swap_bits(x, i, j):
... if (x >> i) & 1 != (x >> j) & 1:
... bit_mask = (1 << i) | (x << j)
... x ^= bit_mask
... return x
...
>>> swap_bits(0x55555, 1, 2)
1048579
>>> hex(swap_bits(0x55555, 1, 2))
'0x100003'
>>>
为了增加趣味性,这可以调整为无分支的,通过取m=((x>>i)^(x>>j))&1
和xoring x by(很好,但这恰好是文章中的一个输入错误。我同样的问题也适用于已更正的(1)
bit_mask = (1 << i) | (1 << j)
unsigned swap_bits(unsigned val, int i, int j) {
unsigned b = ((val >> i) ^ (val >> j)) & 1;
return ((b << i) | (b << j)) ^ val;
}