【发布时间】:2017-12-22 23:24:09
【问题描述】:
我想像这样在 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 中做到这一点?
编辑:使用来自 cmets 的 Bit Twiddling Hacks 中的“Interleave bits the明显方式”解决了这个问题。我将两个 uint32_t 合并到一个 uint64_t。它的用途是合并两个流,但如果两个不同的值对彼此接近,则合并后的值也应该有小的差异。
【问题讨论】:
-
有一个直截了当的方法:确定每一位(
&带有移位的 1 位掩码)并转换到您的结果中。但这并不“简单”。这个练习的目的是什么?也许有更好的方法来解决导致这个想法的问题? -
就我个人而言,我会编写一个“填充函数”,它会产生
a_1 0 a_2 0 a_3 0 a_4等。在你的两个数字上调用它,进一步抵消其中一个数字和|它们以获得结果。 -
你打算如何处理溢出?在您定义之前,没有任何解决方案是可能的。
-
在Bit Twiddling Hacks 上搜索“interleave bits” ...
-
现在,这不是一个好问题:1.)答案需要编写尚不存在的代码(我们更多的是帮助处理现有代码,尽管这不是严格要求)2.)问题没有完全定义,正如Martin所指出的那样 3.)目的不清楚——如果你这样做可能会更有意义还要解释为什么你想这样做。
标签: c integer bit-manipulation concatenation