• 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
    

      

    四、进阶

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

  • 相关阅读:
    06文件操作
    内核层和用户层通讯的三种方式
    中断门
    工业控制网络安全技术与实践
    前言-anton安卓逆向的入门(零)
    前言与目录-白帽子讲Web安全(零)
    前言与目录-IDA Pro权威指南(零)
    前言与目录-C/C++常用算法手册(零)
    前言与目录-java常用算法手册(零)
    《想你的时候我和自己靠得很近》
  • 原文地址:https://www.cnblogs.com/bethansy/p/11827958.html
Copyright © 2020-2023  润新知