我想在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中有(简单)方法吗?
编辑:使用" Interleave位以明显的方式解决它"来自评论中的Bit Twiddling Hacks。我将两个uint32_t合并为一个uint64_t。使用它是合并两个流,但约束条件是如果两个不同的值对彼此接近,合并的值也应该有很小的差异。
答案 0 :(得分:0)
在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位的情况。