混合两位序列

时间:2010-04-02 12:27:39

标签: bit-manipulation

有没有巧妙的方法来混合两个比特序列,使得来自第一个序列的比特将位于奇数位置,而来自第二个序列的比特将位于偶数位置。
两个序列都不超过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]

2 个答案:

答案 0 :(得分:1)

在C#中

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种优化算法。两者都不是特别简单但没有测试我猜它们比循环快得多。