【问题标题】:Mask for clearing m bits after n LSBitsn LSBits 后清除 m 位的掩码
【发布时间】:2015-01-21 07:03:42
【问题描述】:

我在一次采访中被问到这个问题,以清除 16 位整数的 n 位后的 m 位。

假设数字是 10010010010100101。从 LSBit 中清除 5 位后的三位。

之前:1001100111011001 之后:1001100100011001

我的面具解决方案是(~0 << (m+n))+((1<<n)-1)

还有比这更好的解决方案吗?

【问题讨论】:

  • 我的一个建议是不要限制自己全部通过位操作来完成。一个容易看出其正确性的解决方案是为 [0'b1, 0'b11, 0'b111, ...] 的位串创建一个查找表,然后使用该表获取 m 的掩码移动了 n。
  • 您的示例显示从右侧 5 位后清除
  • FWIW, std::bitset 可能是一个“更好”的解决方案

标签: c++ c bit-manipulation bit


【解决方案1】:

我不确定“更好”,但我似乎总是以同样的方式构建面具。

((1u<<m)-1)<<n

对于 m=3 n=5 这给出了

000011100000

然后使用这个掩码从另一个值中清除这些位,

x & ~(((1u<<m)-1)<<n)

【讨论】:

  • 如果他真的想从左边做这个,那我猜应该是 16 - n
  • 是的。我想是这样。然后是相同数量的操作。如果真的是从右边,那我算5,OP算6。
  • 建议使用无符号整数:(1u&lt;&lt;m)-1 &lt;&lt; n
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2013-12-05
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多