将2个32位整数插入64个整数

问题描述 投票:0回答:1

因此,我承担了将两个32位整数交织为一个的任务,如下所示:a_31,...,a_0 and b_31,...,b_0, return the 64-bit long that contains their bits interleaved: a_31,b_31,a_30,b_30,...,a_0,b_0.我尝试通过将每个MSB与一个在MSB位置具有1的助手一起从MSB中取出,然后将它们组合在一起来实现。基本上将“ a”整数放​​在奇数位,将“ b”整数放在偶数位。我无法调用其他函数(甚至是Math.pow)我的代码:

public static long interleave(int a, int b) {
        long tempA = a;
        long tempB = b;
        long helper = 0x0000000080000000L;
        long ans=0;
        for (int i = 0; i <32 ; i++) {
            ans = ans | ((helper & tempA) << (31-(2*i)));
            ans = ans | ((helper & tempB)<<(30-(i+i)));
            helper = helper >>>1;
        }
        return  ans;
}

我的测试在这里失败:

Expected :-6148914691236517206
Actual   :7905747459547660288

一些调试和解决问题的帮助,以及有关解决问题的建议。

java bit interleave
1个回答
0
投票

为了调试您的代码,我建议单步执行并在每次迭代期间写下变量的值。查看它们是否符合您的期望。如果没有,您将确切地找到代码在什么地方和什么地方做错了。


关于有效的解决方案,我建议考虑尽可能简单。您基本上想要这样:(减少为8bit-> 16bit以提高可读性)

输入:

AAAAAAAABBBBBBBB

输出:

ABABABABABABABAB

请注意,所有B位如何在结果中恰好位于“双精度”位置。并且所有A位都恰好在“双”位置向左移动一位。

因为我们知道位只能是1或0,所以基本上可以归结为:对于b中的每一位,即1,我们希望结果在原始位置具有1 乘以2] >。对于a中的每一位1,我们希望结果在原始位置乘以2加1中具有1

这样可以很容易地将其转录为代码:

public static long interleave(int a, int b) {
    long ans = 0;
    for (int i = 0; i < 32; i++)
    {
        if ((a & (1<<i)) != 0)    // the bit at position i in a is 1
        {
            ans |= 1 << i*2 + 1;  // set the bit at position (i*2 + 1) in ans to 1
        }
        if ((b & (1<<i)) != 0)    // the bit at position i in b is 1
        {
            ans |= 1 << i*2;      // set the bit at position (i*2) in ans to 1
        }
    }
    return ans;
}
© www.soinside.com 2019 - 2024. All rights reserved.