颠倒二进制位

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速度快啊。

上一篇下一篇

猜你喜欢

热点阅读