LeetCode刷题2——颠倒二进制位

一、题目要求

 

 

 

 二、题目背景

 此题依旧属于位运算范畴

知识点1:有符号和无符号二进制是怎样表现的?

对于有符号数,最高位为1说明是个负数

知识点2:进制之间的相互转换

(1)十进制转十六进制

hex(n)

(2)十六进制转十进制

int(str,16),其中str是16进制字符串

(3)十进制转二进制

bin(n) ,其中n就是十进制整数

(4)二进制转十进制

int(str,2)  其中str是二进制的字符串表现形式

 三、解题思路

3.1 思路1

  (1)代码

首先想到的就是将这个二进制字符串倒叙显示就可以了即S[::-1]

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        return int(bin(n)[2:][::-1],2)

(2)测试结果

测试运行结果错误,结果见下图,在进行n转二进制时高位0被自动忽略,导致后续转换失败

bin(43261596)
'0b10100101000001111010011100'

(3)优化

设置一个格式,将整数转成二进制时高位补0   b='{:032b}'.format(n),    '{:32b}'.format(n)得到的结果就是高位不补0,运行结果如下

  

3.2 思路2

还可以通过移位的操作,执行用时比上面的更快

 

 

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        res=0
        for i in range(32):
            res=res<<1
            res+=n&1
            n= n>>1
        return res

  

四、进阶

如果要多次调用这个函数,又该如何优化算法?

posted @ 2019-11-09 21:29  bethansy  阅读(361)  评论(0编辑  收藏  举报