颠倒二进制位
2018-11-15 本文已影响0人
3ni
颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 43261596
输出: 964176192
解释: 43261596 的二进制表示形式为 0000001010010100000111101001110
返回 964176192
其二进制表示形式为
00111001011110000010100101000000
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(self, n):
b = []
tn = n
while tn:
b.append(tn % 2)
tn = tn / 2
while len(b) != 32:
b.append(0)
return bintodec(b)
def bintodec(bl):
s = 0
index = 1
for i in bl[::-1]:
s += i*index
index *= 2
return s
上述代码思路就是先将数字分解为二进制,然后每一位反向进行权值相加,得出需要的结果。其实还有更好的方法,如下:
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(self, n):
r = 0
for i in range(32):
r = r << 1
r = r | (n & 1)
n = n >> 1
return r
这次的代码更简单,并且速度更快,主要思路预先定义一个数(r)为0,然后每次取n的最后一位,赋值给r的最后一位,然后r左移,n右移,最后就是所需的结果。
用Python运行大约28ms,如果同样代码用c来写只需要4ms,还是c速度快啊。