我有一个32位整数,我将其视为一个位域。我对以3n形式的索引的位的值感兴趣,其中n的范围是0到6(0到18之间的每第三个位)我对3n + 1形式的索引位不感兴趣或者3N + 2。
我可以很容易地使用按位AND运算符来保留我感兴趣的位,并将所有其他位设置为零。
我还需要在7个最低位位置“打包”我感兴趣的位。因此位置0的位保持为0,但位置3的位移动到位置1,位置6的位移动到位置2,依此类推。
我想以有效的方式做到这一点,理想情况下不使用循环。是否有可以应用于整数的操作组合来实现此目的?
由于我们这里只讨论整数算术,我认为我打算使用的编程语言并不重要。但如果你需要知道:
我将使用JavaScript。
答案 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