我想把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位值a
和b
。结果是4位值c
。对于a
的每个值,我们可以计算a
中c
的移位值并构建一个表。
// 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 }
现在,交错
a
和b
非常简单:c = a_table[a] | b_table[b]
不要交错两个2位值,可以考虑一次交错更多的位。在Bit Twiddling Hacks处显示的loookup表是一次交错8位的情况。