有没有巧妙的方法来混合两个比特序列,使得来自第一个序列的比特将位于奇数位置,而来自第二个序列的比特将位于偶数位置。
两个序列都不超过16b,因此输出将适合32位整数。
示例:
First sequence : 1 0 0 1 0 0
Second sequence : 1 1 1 0 1 1
Output : 1 1 0 1 0 1 1 0 0 1 0 1
我考虑过制作大小为2 ^ 16的整数数组,然后输出为:
arr[first] << 1 | arr[second]
答案 0 :(得分:1)
:
public Int32 Mix(Int16 b1, Int16 b2)
{
Int32 res = 0;
for (int i=0; i<16; i++)
{
res |= ((b2 >> i) & 1) << 2*i;
res |= ((b1 >> i) & 1) << 2*i + 1;
}
return res;
}
答案 1 :(得分:1)
查看http://graphics.stanford.edu/~seander/bithacks.html#InterleaveTableLookup此页面列出了明显的(for循环)和3种优化算法。两者都不是特别简单但没有测试我猜它们比循环快得多。