当前位置: 首页 > news >正文

leetcode_位运算 190.颠倒二进制位

190. 颠倒二进制位

  • 颠倒给定的 32 位无符号整数的二进制位。

1. 字符串

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        res = "" # 创建一个保存结果的空字符串
        for b in str(bin(n))[2:]:
        	# 遍历n的二进制数
            res = b + res 
            # 把每一位从头部插入res
        while len(res) < 32:
            res += "0"
            
        return int(res, 2)
  • 执行过程:

    • 假设输入 n = 43261596(即二进制为00000010100101000001111010011100),反转过程如下:

    • 二进制字符串:bin(43261596) 得到 ‘0b10100101000001111010011100’,去掉 ‘0b’ 后得到 ‘10100101000001111010011100’

    • 反转字符串:遍历每一位,将其按顺序添加到 r 前面:

      • r = ‘0’
        r = ‘00’
        r = ‘000’
        r = ‘0000’
        (继续添加,直到所有位反转)
        最终得到r = ‘00111001011110000010100101000000’
    • 确保长度为 32 位:反转后的 r 已经是 32 位,所以无需额外填充0

    • 返回结果:将 r = ‘00111001011110000010100101000000’ 转换为整数,得到 964176192

  • 时间复杂度: O(n)

  • 空间复杂度: O(1)

2. 循环

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        result = 0
        for i in range(32):
            result <<= 1  
            # 左移 result 为 1 位
            result |= (n & 1)  
            # 将 n 的最低有效位加到 result 中
            n >>= 1  
            # n 右移 1 位
        return result
  • 执行过程:
    • 第1 步(i = 0):
      num = 43261596 = 00000010100101000001111010011100
      提取最低有效位:num & 1 = 0(最低位是 0)
      result = result << 1 = 0 << 1 = 0(将 result 左移一位,为下一位腾出空间)
      result |= 0 → result = 0(将提取的位加到 result 中)
      num >>= 1 → num = 21630798(右移 num,去掉最低位)

    • 第 2 步(i = 1):
      num = 21630798 = 0000001010010100000111101001110
      提取最低有效位:num & 1 = 0(最低位是 0)
      result = result << 1 = 0 << 1 = 0
      result |= 0 → result = 0
      num >>= 1 → num = 10815399

    • 第 3 步(i = 2):
      num = 10815399 = 000000101001010000011110100111
      提取最低有效位:num & 1 = 1(最低位是 1)
      result = result << 1 = 0 << 1 = 0
      result |= 1 → result = 1(将提取的 1 加到 result 中)
      num >>= 1 → num = 5407699

    • 第 4 步(i = 3):
      num = 5407699 = 00000010100101000001111010011
      提取最低有效位:num & 1 = 1(最低位是 1)
      result = result << 1 = 1 << 1 = 2
      result |= 1 → result = 3
      num >>= 1 → num = 2703849

    • 第 5 步(i = 4):
      num = 2703849 = 0000001010010100000111101001
      提取最低有效位:num & 1 = 1(最低位是 1)
      result = result << 1 = 3 << 1 = 6
      result |= 1 → result = 7
      num >>= 1 → num = 1351924

    • 第 6 步(i = 5):
      num = 1351924 = 000000101001010000011110100
      提取最低有效位:num & 1 = 0(最低位是 0)
      result = result << 1 = 7 << 1 = 14
      result |= 0 → result = 14
      num >>= 1 → num = 675962
      …(继续这个过程直到处理完所有 32 位)

    • 直到第 32 步:
      经过 32 次循环,num 会变成 0,result 存储了反转后的二进制值

  • 时间复杂度: O(32) = O(1)
  • 空间复杂度: O(1)

相关文章:

  • 8 SpringBootWeb案例(上): 查询【分页功能(分页插件)】、删除、新增、修改
  • 第三章 组件(6)- 事件处理
  • 设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)
  • centos服务器巡检脚本
  • Windows逆向工程入门之字符串类型解析与拓展
  • C语言预处理学习笔记
  • Docker Desktop 入门教学
  • python组备赛笔记(基础篇)
  • 从零到一:构建现代 React 应用的完整指南
  • Netty入门详解
  • halcon机器视觉深度学习对象检测,物体检测
  • 自学FOC系列分享--SVPWM和clark 逆变换及代码实战
  • docker从容器中cp到本地、cp本地到容器
  • LabVIEW开发中的电机控制与相机像素差
  • Visual Studio中打开多个项目
  • 【微中子代理踩坑-前端node-sass安装失败】
  • 敏捷开发07:敏捷项目可视化管理-ScrumBoard(Scrum板)使用介绍
  • rust 实例化动态对象
  • IC卡、M1卡及各类卡的原理使用说明
  • 以太网的MAC(介质访问控制)详解
  • 文旅部副部长饶权出任国家文物局局长
  • 三大交易所修订股票上市规则:明确关键少数责任,强化中小股东保障
  • 永辉超市一季度净利降近八成,未来12个月至18个月是改革成果集中释放期
  • 俄总统助理:普京与美特使讨论了恢复俄乌直接谈判的可能性
  • 今年地质灾害防治形势严峻,哪些风险区被自然资源部点名?
  • 预热苏杯,“谁羽争锋”全国新闻界羽毛球团体邀请赛厦门开赛