C++ С++:带位位置的快速动作

C++ С++:带位位置的快速动作,c++,algorithm,c++11,bit-manipulation,bit,C++,Algorithm,C++11,Bit Manipulation,Bit,有一项任务: 有两个数字: src通过设置相应的位来指定从0到31的数字。 dst指定要选择的src中设置的数字的位置 例如: src=0b11010110-编号№1 = 1, №2 = 2, №3 = 4, №4 = 6, №5=7 掩码=0b00001010-提取数字№1.№3来自src 结果=0B01000000 你能告诉我你能多快完成吗? 我写了下面的代码,但也许你可以做得更好 int unzip_variant(const int src, const int mask) {

有一项任务: 有两个数字:

src通过设置相应的位来指定从0到31的数字。 dst指定要选择的src中设置的数字的位置 例如:

src=0b11010110-编号№1 = 1, №2 = 2, №3 = 4, №4 = 6, №5=7

掩码=0b00001010-提取数字№1.№3来自src

结果=0B01000000

你能告诉我你能多快完成吗? 我写了下面的代码,但也许你可以做得更好

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;
}
比特!=如果x的最高符号位也包含数据,则0-非常有用
通过实验获得了最快的代码,我的速度再快不过了

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;
}

如果您想改进已经运行的代码,您可能想将其移动到@nada,也许我们需要一个根本不同的算法,而不是改进当前的算法。根本不同的算法在codereview上讨论。规范不清楚,这个例子没有意义,因为它没有dst,也不清楚为什么结果是这样,代码基本上实现了src&mask,只是跳过了第一位,这看起来就像一个bug。请改进这个问题,以明确函数应该做什么。使用-function,您可以将循环迭代次数从sizeofint*8减少到src中的1位№
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;
}