【问题标题】:Best way to generate the following bitmask for a given input?为给定输入生成以下位掩码的最佳方法?
【发布时间】:2023-03-18 11:29:01
【问题描述】:

我正在尝试找出生成以下位掩码的最佳方法: - 对于给定的输入 n,输出将是一个位掩码,其中设置了前 (n-1) 位,而所有其他位都未设置。

例子:

if n = 1, output = 0x00000001 = 00000000000000000000000000000001
if n = 2, output = 0x00000003 = 00000000000000000000000000000011
if n = 3, output = 0x00000007 = 00000000000000000000000000000111

我知道明显的迭代方式(一次设置一个位),这将花费 O(n) 时间....我只是想知道是否有任何“位魔术”可以做到这一点恒定时间,或者至少是次线性时间(不使用 LUT !!)

有接受者吗?

【问题讨论】:

  • 我没有说设置了 n-1 位,我说会设置前 n-1 位(即第 0 到第 n-1 位) - 请记住,LSB 是第 0 位,所以对于 n=1,前 0 位(仅表示第 0 位)将被设置!
  • 哎呀,以上是回复评论的,看来我还没说完他就删了!!

标签: c bit-manipulation bitmask


【解决方案1】:

应该这样做:(1 << n) - 1

【讨论】:

  • 这不适用于n = 32。在我的带有 clang 4.1 的 OSX 10.8.4 机器上:(1 << 32) => 1 产生 0 而不是 0xFFFFFFFF。
  • 事实上,@DietrichEpp 在this answer 中有评论解释它。
  • 经过更多研究,有一个duplicate question 处理n=32。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多