Dav*_*ard 26 python bit-manipulation python-2.7
给定一个十进制整数(例如65),如何反转Python中的底层位?即.以下操作:
65 ? 01000001 ? 10000010 ? 130
Run Code Online (Sandbox Code Playgroud)
看来这个任务可以分为三个步骤:
步骤#2和3似乎很简单(见本和本 SO问题关系到步骤#2),但我卡上的步骤1#.步骤#1的问题是检索带有填充零的完整十进制表示(即65 = 01000001,而不是1000001).
我四处寻找,但似乎找不到任何东西.
nne*_*neo 37
int('{:08b}'.format(n)[::-1], 2)
Run Code Online (Sandbox Code Playgroud)
您可以指定任何填充长度代替8.如果您想要真正的花哨,
b = '{:0{width}b}'.format(n, width=width)
int(b[::-1], 2)
Run Code Online (Sandbox Code Playgroud)
允许您以编程方式指定宽度.
小智 7
如果您的速度更快,可以使用http://leetcode.com/2011/08/reverse-bits.html中描述的技术
def reverse_mask(x):
x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1)
x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2)
x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4)
x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8)
x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16)
return x
Run Code Online (Sandbox Code Playgroud)
def reverse_bit(num):
result = 0
while num:
result = (result << 1) + (num & 1)
num >>= 1
return result
Run Code Online (Sandbox Code Playgroud)
我们实际上并不需要将整数转换为二进制,因为整数在Python中实际上是二进制的。
反转的想法就像进行整数的空间反转。
def reverse_int(x):
result = 0
pos_x = abs(x)
while pos_x:
result = result * 10 + pos_x % 10
pos_x /= 10
return result if x >= 0 else (-1) * result
Run Code Online (Sandbox Code Playgroud)
对于每个循环,原始数字将丢弃最右边的位(二进制)。我们获得最右边的位,并<<1在添加新位时在下一个循环中将2()相乘。
小智 6
最好的方法是逐位执行
def reverse_Bits(n, no_of_bits):
result = 0
for i in range(no_of_bits):
result <<= 1
result |= n & 1
n >>= 1
return result
# for example we reverse 12 i.e 1100 which is 4 bits long
print(reverse_Bits(12,4))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37458 次 |
| 最近记录: |