Swift 实现:颠倒 32 位无符号整数的二进制位
网罗开发
(小红书、快手、视频号同名)
大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者
文章目录
- 摘要
- 描述
- Swift 题解答案
- 题解代码
- 代码分析
- 示例测试及结果
- 时间复杂度
- 空间复杂度
- 总结
- 未来展望
- 参考资料
摘要
在本文中,我们将学习如何使用 Swift 解决 LeetCode 问题,反转 32 位无符号整数的二进制位。通过高效算法和进阶优化方法,实现快速、准确的结果输出。本文还提供了详细的代码分析、时间复杂度和空间复杂度的评估。
描述
题目要求颠倒给定 32 位无符号整数的二进制位,并返回结果。
示例 1:
输入: n = 00000010100101000001111010011100
输出: 964176192 (00111001011110000010100101000000)
解释: 输入表示的整数是 43261596,反转后的整数是 964176192。
示例 2:
输入: n = 11111111111111111111111111111101
输出: 3221225471 (10111111111111111111111111111111)
解释: 输入表示的整数是 4294967293,反转后的整数是 3221225471。
Swift 题解答案
核心思路:
- 每次从输入的右端提取一个二进制位,并将其“反向”插入到输出的正确位置。
- 使用位运算(右移和左移)来实现高效处理。
题解代码
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
}
代码分析
-
初始化变量:
result
用于存储反转后的值,初始为0
。input
是输入值,用于逐步提取最低位。
-
核心逻辑:
- 循环 32 次(对应 32 位整数)。
- 提取
input
的最低位(input & 1
)。 - 将提取的位插入
result
的最高位位置(result = (result << 1) | bit
)。 - 将
input
右移以准备处理下一个位(input >>= 1
)。
-
返回结果:
- 当循环结束时,
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)
。
总结
- 使用位运算实现了高效的原地反转算法,没有额外的内存开销。
- 提供了一个清晰易懂的实现方法,适合应用于实际工程。
未来展望
-
优化多次调用:
- 通过缓存已计算结果的方式减少重复计算。
- 使用哈希表存储中间结果,提高性能。
-
扩展思路:
- 研究反转 64 位或更大整数的解法。
- 优化算法在硬件级别的实现,例如并行计算。
参考资料
- LeetCode 官方题解
- Swift 位运算相关文档