【问题标题】:Alternating Bitwise concatenation in CC中的交替按位连接
【发布时间】: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


【解决方案1】:

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 所示的查找表是一次交错 8 位的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多