如何反转数字的备用位

Sex*_*ast 2 python bit-manipulation

问题是如何从数字开始反转一个数字的交替位LSB.目前我正在做的是先做一个

count = -1
while n:
   n >>= 1
   count += 1
Run Code Online (Sandbox Code Playgroud)

首先找到最左边的设置位的位置,然后运行一个循环来反转每个备用位:

i = 0
while i <= count:
 num ^= 1<<i
 i += 2
Run Code Online (Sandbox Code Playgroud)

有没有一个快速的黑客解决方案,而不是这个相当无聊的循环解决方案?当然,解决方案不能对整数的大小做任何假设.

jsj*_*jsj 5

我认为这可能有效:

具有交替掩码的按位异或10101010...10应该每隔一位反转.

如果要在"0011"中反转交替位,下表显示结果:

i | m | i XOR m
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
Run Code Online (Sandbox Code Playgroud)

在python XOR中实现了i ^ m.当然你也必须确定你的面具的字面值,这取决于你的i数字的大小.