【发布时间】:2018-12-21 08:08:02
【问题描述】:
假设你有一个 32 位的数据类型:
// The letters are just to identify the position of each bit later in the post
abcdefgh ijklmnop qrstuvwx yzABCDEF
我正在记录在某些位置“丢弃”位的最有效方法,其中丢弃意味着“删除”给定位,并移动以下位以填充其位置。
示例:假设我想删除位“a”和“q”。那么结果应该是这样的:
bcdefghi jklmnopr stuvwxyz ABCDEF00
或
00bcdefg hijklmno prstuvwx yzABCDEF
任何一个结果都可以接受。
在我的具体情况下,我还可以施加以下约束:
- 在我的情况下,要删除的位置是静态的;也就是说,我总是需要准确地删除第 1 位和第 16 位(“a”和“q”)
- 要删除的位(“a”和“q”)始终为 0
- 最终填充数据的位(操作后向左或向右的“00”)无关紧要 - 即,它们实际上是 0 还是 1 无关紧要
目前我正在使用这样的方法(伪代码):
// called with number = abcdefgh ijklmnop qrstuvwx yzABCDEF
auto drop_bits_1_16(unsigned int number)
{
number = number << 1; // number becomes: bcdefghi jklmnopq rstuvwxy zABCDEF0
unsigned number1 = number & 0xFFFE0000; // number1 comes: bcdefghi jklmnop0 00000000 00000000
unsigned number2 = number & 0x0000FFFF; // number2 becomes: 00000000 00000000 rstuvwxy zABCDEF0
number2 = number2 << 1; // number2 becomes: 00000000 0000000r stuvwxyz ABCDEF00
return number1 | number2; // returns bcdefghi jklmnopr stuvwxyz ABCDEF00
}
但我想知道是否还有更聪明/更有效的方法?
【问题讨论】:
-
如果有一个聪明的“位黑客”,它很有可能出现在Sean E. Anderson的编译中。
-
如果你能忍受两边都是零,
number + (unsigned short)number;-) -
实际上,您将删除第 1 位和第 17 位,或 0 和 16 位,具体取决于您是基于 0 还是基于 1。
标签: c++ algorithm bit-manipulation