【发布时间】: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