【问题标题】:Find most significant bit in Swift在 Swift 中查找最重要的位
【发布时间】:2026-02-08 18:20:03
【问题描述】:

我需要在 Swift 中找到整数的most significant bit (MSB) 的值(或位置)。

例如:

  • 输入数字: 9
  • 二进制输入: 1001
  • MS 为二进制: 1000 ->(十进制为 8)
  • MS 位置为十进制: 3(因为1<<3 == 1000

许多处理器(英特尔、AMD、ARM)都有这方面的说明。在 c 中,these are exposed。这些指令是否可以通过库函数在 Swift 中类似地使用,还是我需要 implement some bit twiddling

这个值对我来说更有用。

如果返回一个位置,则可以通过一次移位轻松得出该值。

相反,除非有一个快速的Hamming Weight / pop count 函数可用,否则根据值计算位置并不是那么容易。

【问题讨论】:

  • 使用位操作更容易找到该值(例如您链接的内容减去魔术 DeBruijn 乘法/查找),但我对 Swift 了解不多我找不到一个

标签: swift bit-manipulation


【解决方案1】:

你可以使用flsl()函数(“find last set bit, long”):

let x = 9
let p = flsl(x)
print(p) // 4

结果是4,因为flsl() 和相关函数从1 开始对位进行编号,最低有效位。

在 Intel 平台上,您可以使用 _bit_scan_reverse 内在函数, 在我在 macOS 应用程序中的测试中,这转换为 BSR 说明。

import _Builtin_intrinsics.intel

let x: Int32 = 9
let p = _bit_scan_reverse(x)
print(p) // 3

【讨论】:

  • 太好了,谢谢——你知道这是否可以编译成 intel / ARM 上的汇编指令吗?
  • 值得命令单击该函数名称并在库标题中查看其兄弟方法。方法也可用于最低有效位,Int32Int64 的变体以及机器的本机字大小 Int(尽管命名似乎不规则)。
  • @Benjohn:它似乎编译为库调用。在 Intel 平台上还有 _bit_scan_reverse()is 一个内在函数),您可以使其可用,例如与import simd。我还没有找到 ARM 的等价物。
  • @Benjohn:重新命名:l 后缀是用于采用 long 的函数,而这恰好是 Int 在 Swift(32 位或 64 位)中的含义。
  • 相关:*.com/questions/41353482/…。出于某种原因,__builtin_clz 编译,但给出了链接器错误。