с++:使用位位置的快速操作

с++: rapid actions with bits positions

本文关键字:操作 位置      更新时间:2023-10-16

有一个任务: 有 2 个数字:

  • SRC 通过设置相应的位来指定从 0 到 31 的数字。
  • DST 指定在 SRC 中设置的要选择的数字的位置

例如:

src = 0b11010110- 数字 No1 = 1, No2 = 2, No3 = 4, No4 = 6, No5 = 7

mask = 0b00001010- 从 src 中提取编号 No1、No3

result = 0b01000100

你能告诉我你能多快做到这一点吗? 我在下面写了代码,但也许你可以做得更好?

int unzip_variant(const int src, const int mask)
{
int unzipped = 0;
int pos = 0;
for (int index = 1; index <= с_size; index ++)
{
if (src & (1 << index))
{
pos += 1;
if (mask & (1 << pos))
unzipped |= (1 << index);
}
}
return unzipped;
}

我希望我正确理解您的问题,并编写了以下解决方案:

// x: value, m: mask, for your dataset: unzip(0xd6, 0xa) -> 0x44
unsigned unzip(unsigned x, unsigned m) {
unsigned bit, mm;
for(mm = 0, bit = 1; bit <= x; bit <<= 1)
if(bit & x)
mm |= bit & m;
else
m <<= 1;
return x & mm;
}

if继续条件可能有用的修改:

for(mm = 0, bit = 1; bit <= x && bit != 0; bit <<= 1)
  • bit != 0 - 很有用,如果x的符号位(最高(也包含数据

实验性地获得了我无法获得的最快代码。

int unzip_variants(
const int   numbers,
const int   variants
)
{
int unzipped_variants = 0;
int pos = 0;
for (int index = 1; index <= с_size; index++)
{
pos += (variants >> index) & 1;
unzipped_variants |= (((variants >> index) & 1) *
((numbers >> pos) & 1)) << index;
}
//  for (int variants_index = 1; variants_index <= с_size; variants_index++)
//  {
//      if (variants & (1 << variants_index))
//      {
//          pos += 1;
//
//          if (numbers & (1 << pos))
//              unzipped_variants |= (1 << variants_index);
//      }
//  }
return unzipped_variants;
}