用C

2017-07-18 27 views
1

交替按位拼接我想连接两个整数A,B用C这样的:用C

如果有位单位表示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 bits显而易见的方式”从评论Twiddling黑客。我将两个uint32_t合并为一个uint64_t。使用它是为了合并两个流,但是有一个限制,即如果两个不同的值对彼此接近,合并的值也应该有一个小的差别。

+1

有一个直接的**方法:确定每一个位(带有一个移位的1位掩码的'&&)并转入你的结果。尽管这并不“简单”。这个练习的目的是什么?也许有更好的方法来解决导致这个想法的问题? –

+1

就我个人而言,我会写一个“填充函数”,它会产生'a_1 0 a_2 0 a_3 0 a_4'等等。在你的两个数字上调用它,进一步抵消其中的一个和'|'以得到结果。 – Bathsheba

+0

你打算怎么做溢出?直到你定义,没有解决方案是可能的。 –

回答

0

Bit Twiddling Hacks建议的方法中,我认为使用查找表可能是一个合理的方法。它很简单,并且可以扩展到任何输入大小。

考虑交织两个2位值ab。结果是一个4位值c。对于a的每个值,我们可以在c中计算a的移位值,并建立一个表格。

// 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位的值,可以考虑交错larget号一次一点点。在Bit Twiddling Hacks处示出的loookup表是一次交织8位的情况。