【每天学习一点算法 2026/01/21】倒二进制位

每天学习一点算法 2026/01/21

题目:颠倒二进制位

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

  1. 最容易想到的办法就是颠倒二进制字符串再转换成数字(注意需要填充原数字二进制至 32 位)

    typescript 复制代码
    function reverseBits(n: number): number {
      const str = n.toString(2).padStart(32, '0') // 填充原数字二进制至32位
      return parseInt(str.split('').reverse().join(''), 2) // 颠倒二进制字符串再转换成整数
    };
  2. 另外这道题还可以利用分治的思想,将二进制分为两部分,对每部分递归执行翻转操作,具体思路如下:

    • 32 位二进制数 → 先交换高 16 位和低 16 位
    • 每个 16 位 → 交换高 8 位和低 8 位
    • 每个 8 位 → 交换高 4 位和低 4 位
    • 每个 4 位 → 交换高 2 位和低 2 位
    • 每个 2 位 → 交换高 1 位和低 1 位
    • 最终完成整体反转。

    首先交换高 16 位和低 16 位 很简单, n = (n >>> 16) | (n << 16)

    然后每个 16 位交换高 8 位和低 8 位,关键就在于如何选中每个 16 位的高 8 位和低 8 位,我们可以很容易的就想到利用掩码 11111111000000001111111100000000 & n 可以精准选中高 8 位,同理利用掩码 00000000111111110000000011111111可以选中低 8 位

    然后高位左移 8 位,低位右移 8 位即可,掩码我们用 16 进制 n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8)

    后续几步同理使用掩码选中再位移就能实现整个翻转:

    typescript 复制代码
    function reverseBits(n: number): number {
      n = (n >>> 16) | (n << 16) // 交换高 16 位和低 16 位
      n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8) // 交换每个 16 位的高 8 位和低 8 位
      n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4) // 交换每个 8 位的高 4 位和低 4 位
      n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2) // 交换每个 4 位的高 2 位和低 2 位
      n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1) // 交换每个 2 位的高 1 位和低 1 位
      return n
    };

题目来源:力扣(LeetCode)

相关推荐
لا معنى له28 分钟前
Var-JEPA:联合嵌入预测架构的变分形式 —— 连接预测式与生成式自监督学习 ----论文翻译
人工智能·笔记·学习·语言模型
世人万千丶30 分钟前
Flutter 框架跨平台鸿蒙开发 - 宠物语言翻译器应用
学习·flutter·华为·开源·harmonyos·鸿蒙
AI成长日志33 分钟前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试
"菠萝"36 分钟前
C#知识学习-021(文字关键字)
开发语言·学习·c#
chase。43 分钟前
【学习笔记】让机器人“边想边动”——实时动作分块流策略的执行方法
笔记·学习·机器人
abant244 分钟前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展
漫霂1 小时前
二叉树的统一迭代遍历
java·算法
炽烈小老头1 小时前
【每天学习一点算法 2026/04/08】阶乘后的零
学习·算法
Mr_Xuhhh1 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
MicroTech20251 小时前
突破虚时演化非酉限制:MLGO微算法科技发布可在现有量子计算机运行的变分量子模拟技术
科技·算法·量子计算