190. 颠倒二进制位

190. 颠倒二进制位

题目

方法1:
利用位运算来操作,



仔细看下代码,看看怎么做的:

class Solution:
    def reverseBits(self, n: int) -> int:
        ans = 0
        mi = 31
        while n:
            # 注意这里&表示与运算,比直接对2求余要算的更快
            ans += (n&1)<<mi
            mi -= 1
            # 这里使用>>右移运算,比直接对2整除算的更快
            n = n>>1
        return ans

方法2:
分治的方法
我们可以通过以下步骤实现该算法:
首先,我们将原来的 32 位分为 2 个 16 位的块。
然后我们将 16 位块分成 2 个 8 位的块。
然后我们继续将这些块分成更小的块,直到达到 1 位的块。
在上述每个步骤中,我们将中间结果合并为一个整数,作为下一步的输入。
看一下,下面的代码中的位运算,左移右移和或操作相结合,刚好可以颠倒一个二进制数:

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        n = (n >> 16) | (n << 16)
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8)
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4)
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2)
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1)
        return n
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容