Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 位交换算法中的位掩码_Algorithm_Binary - Fatal编程技术网

Algorithm 位交换算法中的位掩码

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

在完全理解一个基本算法时有点困难,该算法接受一个数字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)和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;
}