【问题标题】:Bit Twiddling Hacks: interleave bits the obvious way [closed]Bit Twiddling Hacks:以明显的方式交错位[关闭]
【发布时间】:2010-07-08 12:55:31
【问题描述】:

我对这个问题很感兴趣

以明显的方式交错位

(来自http://graphics.stanford.edu/~seander/bithacks.html

unsigned short x;   // Interleave bits of x and y, so that all of the
unsigned short y;   // bits of x are in the even positions and y in the odd;
unsigned int z = 0; // z gets the resulting Morton Number.

for (int i = 0; i < sizeof(x) * CHAR_BIT; i++) // unroll for more speed...
{
  z |= (x & 1U << i) << i | (y & 1U << i) << (i + 1);
}

有人可以通过示例向我解释这是如何工作的吗?

例如,如果我们有x = 100101y = 010101,结果会是什么?

【问题讨论】:

  • @davit-datuashvili:请停止使用算法标签标记每个问题。

标签: c bit-manipulation bit-shift


【解决方案1】:

位交织本质上采用两个n 位输入数字并产生一个2n 位输出数字,该输出数字交替地从两个输入数字中获取位。也就是说,一个数字的位进入奇数索引,另一个数字的位进入偶数索引。

所以对于你的具体例子:

x = 100101  =  1 0 0 1 0 1
y = 010101  = 0 1 0 1 0 1

interleaved = 011000110011

这里我们使用约定,来自x 的位进入偶数索引(0、2、4...),来自y 的位进入奇数索引(1、3、5...) .即比特交织不是​​commutative操作; interleave(x, y) 一般不等于interleave(y, x)

您还可以将比特交错操作概括为只涉及 2 个以上的数字。

比特交错数字表现出可以在许多重要的空间算法/数据结构中利用的结构特性。

另见

相关问题


“明显”算法

该算法本质上是遍历输入数字的每一位,用按位与检查它是 1 还是 0,用按位或组合这两个位,并通过适当的移位将它们连接在一起。

要了解位是如何重新排列的,只需研究一个简单的 4 位示例。这里xi 表示xi-th(从0 开始)位。

x =    x3    x2    x1    x0
y = y3    y2    y1    y0
                                         Mapping:
z = y3 x3 y2 x2 y1 x1 y0 x0                 x[i] --> z[i+i]
    z7 z6 z5 z4 z3 z2 z1 z0                 y[i] --> y[i+i+1]

一旦您确信映射模式是正确的,实现它只需了解如何执行按位运算即可。

为了清楚起见,这是用 Java 重写的算法 (see also on ideone.com):

    int x = Integer.parseInt("100101", 2);
    int y = Integer.parseInt("010101", 2);
    int z = 0;

    for (int i = 0; i < Integer.SIZE; i++) {
       int x_masked_i = (x & (1 << i));
       int y_masked_i = (y & (1 << i));

       z |= (x_masked_i << i);
       z |= (y_masked_i << (i + 1));
    }
    System.out.println(Integer.toBinaryString(z));
    // prints "11000110011"

另见

【讨论】:

    【解决方案2】:

    “交错”意味着您通过交替来自每个源的位来组合两个数字。下面的例子更容易看出来

    x = 0000
    y = 1111
    
    result = 01010101
    

    交错您给出的两个值会得到以下结果:

    x = 100101 
    y = 010101
    
    result = 100100110011
    

    【讨论】:

    • 我认为前 4 位可能是 0110,实际上,这取决于您按照惯例先取哪个位。 (因此您的示例也应该导致 10101010 代替)。但总的来说,我们都做对了。 - 是的,我给出的 sn-p 至少首先取自 x,所以 x 位在偶数位置(位 0、2 等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多