我想把C中的两个整数a,b连接起来,如下所示:
如果a有位表示a_1 a_2 a_3 a_4...,b有位表示b_1 b_2 b_3 b_4...,我希望我的结果是a_1 b_1 a_2 b_2 a_3 b_3 a_4 b_4
例如:a=5=0101,b=9=1001
那么我的结果应该是01100011。有没有一种(简单的)用C语言来做的方法?
编辑:解决它与“交织比特显而易见的方式”从比特旋转黑客从评论。我将两个uint32合并到一个uint64,它的用途是合并两个流,但是有一个限制,如果两个不同的值对彼此接近,合并的值也应该有一个小的差异。

最佳答案

Bit Twiddling Hacks建议的方法中,我认为使用查找表可能是一种合理的方法。它很简单,可扩展到任何输入大小。
考虑交错两个2位值ab。结果是4位值c。对于a的每个值,我们可以计算ac的移位值并构建一个表。

// a = 00  =>  c = 0x0x : x denotes the position where the bits of b goes
// a = 01  =>  c = 0x1x
// a = 10  =>  c = 1x0x
// a = 11  =>  c = 1x1x

a_table[4] = { 0, 2, 8, 10 }; // in binary format : { 0000, 0010, 1000, 1010 }

同样,对于b:
// b = 00  =>  c = x0x0
// b = 01  =>  c = x0x1
// b = 10  =>  c = x1x0
// b = 11  =>  c = x1x1

b_table[4] = { 0, 1, 4, 5 }; // in binary format : { 0000, 0001, 0100, 0101 }

现在,交错ab非常简单:
c = a_table[a] | b_table[b]

不要交错两个2位值,可以考虑一次交错更多的位。在Bit Twiddling Hacks处显示的loookup表是一次交错8位的情况。

10-06 13:37