保持每个第n位并将它们折叠在最低位

时间:2016-07-27 03:35:39

标签: bit-manipulation

我有一个32位整数,我将其视为一个位域。我对以3n形式的索引的位的值感兴趣,其中n的范围是0到6(0到18之间的每第三个位)我对3n + 1形式的索引位不感兴趣或者3N + 2。

我可以很容易地使用按位AND运算符来保留我感兴趣的位,并将所有其他位设置为零。

我还需要在7个最低位位置“打包”我感兴趣的位。因此位置0的位保持为0,但位置3的位移动到位置1,位置6的位移动到位置2,依此类推。

我想以有效的方式做到这一点,理想情况下不使用循环。是否有可以应用于整数的操作组合来实现此目的?

由于我们这里只讨论整数算术,我认为我打算使用的编程语言并不重要。但如果你需要知道:

  

我将使用JavaScript。

1 个答案:

答案 0 :(得分:2)

如果位的顺序不重要,可以将它们打包成0-6位:

function packbits(a)
{
    // mask out the bits we're not interested in:
    var b = a & 299593; // 1001001001001001001 in binary
    // pack into the lower 7 bits:
    return (b | (b >> 8) | (b >> 13)) & 127;
}

如果初始位排序如下:

bit 31                         bit 0
xxxxxxxxxxxxxGxxFxxExxDxxCxxBxxA

然后打包的顺序是这样的:

bit 7  bit 0
0CGEBFDA