Bootstrap

Swift 实现:颠倒 32 位无符号整数的二进制位

在这里插入图片描述
在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者

摘要

在本文中,我们将学习如何使用 Swift 解决 LeetCode 问题,反转 32 位无符号整数的二进制位。通过高效算法和进阶优化方法,实现快速、准确的结果输出。本文还提供了详细的代码分析、时间复杂度和空间复杂度的评估。

描述

题目要求颠倒给定 32 位无符号整数的二进制位,并返回结果。

示例 1

输入: n = 00000010100101000001111010011100
输出: 964176192 (00111001011110000010100101000000)
解释: 输入表示的整数是 43261596,反转后的整数是 964176192。

示例 2

输入: n = 11111111111111111111111111111101
输出: 3221225471 (10111111111111111111111111111111)
解释: 输入表示的整数是 4294967293,反转后的整数是 3221225471。

Swift 题解答案

核心思路:

  1. 每次从输入的右端提取一个二进制位,并将其“反向”插入到输出的正确位置。
  2. 使用位运算(右移和左移)来实现高效处理。

题解代码

func reverseBits(_ n: UInt32) -> UInt32 {
    var result: UInt32 = 0
    var input = n
    
    for _ in 0..<32 {
        // 将当前最低位移动到结果的最高位位置
        result = (result << 1) | (input & 1)
        // 右移输入以处理下一个位
        input >>= 1
    }
    
    return result
}

代码分析

  1. 初始化变量

    • result 用于存储反转后的值,初始为 0
    • input 是输入值,用于逐步提取最低位。
  2. 核心逻辑

    • 循环 32 次(对应 32 位整数)。
    • 提取 input 的最低位(input & 1)。
    • 将提取的位插入 result 的最高位位置(result = (result << 1) | bit)。
    • input 右移以准备处理下一个位(input >>= 1)。
  3. 返回结果

    • 当循环结束时,result 即为反转后的二进制表示。

示例测试及结果

测试代码

import Foundation

var test1: UInt32 = 0b00000010100101000001111010011100
var test2: UInt32 = 0b11111111111111111111111111111101

print(reverseBits(test1)) // 输出: 964176192
print(reverseBits(test2)) // 输出: 3221225471

结果

964176192
3221225471

时间复杂度

  • 单次调用:循环执行 32 次位操作。
  • 总时间复杂度O(1)(常数复杂度)。

空间复杂度

  • 仅使用常数级别的辅助变量。
  • 总空间复杂度O(1)

总结

  1. 使用位运算实现了高效的原地反转算法,没有额外的内存开销。
  2. 提供了一个清晰易懂的实现方法,适合应用于实际工程。

未来展望

  1. 优化多次调用

    • 通过缓存已计算结果的方式减少重复计算。
    • 使用哈希表存储中间结果,提高性能。
  2. 扩展思路

    • 研究反转 64 位或更大整数的解法。
    • 优化算法在硬件级别的实现,例如并行计算。

参考资料

  • LeetCode 官方题解
  • Swift 位运算相关文档
;