C语言中的交替逐位连接

时间:2017-07-18 08:05:37

标签: c integer bit-manipulation concatenation

我想在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。使用它是合并两个流,但约束条件是如果两个不同的值对彼此接近,合并的值也应该有很小的差异。

1 个答案:

答案 0 :(得分:0)

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位的情况。