我尝试了Google搜索,但找不到任何可理解的@。@ ...
有人可以用外行的术语解释一下这段代码中发生了什么吗?
这是“破解编码面试”一书中的一个问题。
“编写程序以用尽可能少的指令交换整数中的奇数和偶数位(例如,交换0位和1位,交换2位和3位,依此类推)。”
我的操作方式不涉及位操作,因为我无法弄清楚%\...
def swap(n):
b = bin(n)[2:]
print(b)
if len(b)%2 != 0:
c = True
b = b[0] + b
pairs = wrap(b, 2)
pairs = [i[::-1] for i in pairs]
ans = ''.join(pairs)
if c: ans = ans[1:]
print(ans)
但是现在我正在看他们的答案,但我并没有真正理解它((不是因为它不在Python中):
int swapOddEvenBits(int x) {
return ( ((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1) );
最佳答案
让我们分解一下。
return ( ((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1) );
首先,我们来看
(x & 0xaaaaaaaa)
。如果将0xaaaaaaaa
分解为位级别,则最终会得到1010 1010 1010 1010 1010 1010 1010 1010
(因为a
(以二进制形式表示为1010
))。因此(x & 0xaaaaaaaa)
就是说,仅返回1
中每个偶数个放置的x
。这称为位屏蔽。然后,将其右移一位-这就是使偶数切换位置的方式(因此,现在第二位占据第一位的位置,第四位占据第三位的位置,依此类推)。您对
(x & 0x55555555)
进行相同的操作-如果将其分解为位级别,则最终会得到0101 0101 0101 0101 0101 0101 0101 0101
(因为5
(在二进制中为0101
))。这将屏蔽x
中的所有偶数位,并为您提供所有奇数位。然后,将所有位左移1。最后,使用or
(|
)运算符组合两个位序列,这就是您的答案。例子:
让我们以2456086205为例。我们将其转换为二进制并获得
1001 0010 0110 0100 1110 0110 1011 1101
。现在,我们执行(x & 0xaaaaaaaa)
,并获得1001 0010 0110 0100 1110 0110 1011 1101 & 1010 1010 1010 1010 1010 1010 1010 1010
,等于
1000 0010 0010 0000 1010 0010 1010 1000
。将其向右移动,您会得到0100 0001 0001 0000 0101 0001 0101 0100
。现在,执行
(x & 0x55555555)
,并获取1001 0010 0110 0100 1110 0110 1011 1101 & 0101 0101 0101 0101 0101 0101 0101 0101
,等于
0001 0000 0100 0100 0100 0100 0001 0101
。将其向左移动,您会得到0010 0000 1000 1000 1000 1000 0010 1010
。最后,我们执行
0100 0001 0001 0000 0101 0001 0101 0100 | 0010 0000 1000 1000 1000 1000 0010 1010
。然后,我们得到0110 0001 1001 1000 1101 1001 0111 1110
,如您所见,这就是解决方案!