Java 将2个32位整数交织成64位整数

Java 将2个32位整数交织成64位整数,java,bit,interleave,Java,Bit,Interleave,因此,我被赋予了将两个32位整数交织成一个整数的任务,如下所示: a_31,…,a_0和b_31,…,b_0,返回包含其交织位的64位长:a_31,b_31,a_30,b_30,…,a_0,b_0。 我尝试通过从每个具有一个在MSB位置具有1的帮助器的对象中获取MSB,然后组合它们来实现这一点。 基本上把“a”int放在奇数位置,“b”int位放在偶数位置。 我不能调用其他函数(即使是Math.pow) 我的代码: 在调试和找出问题方面提供一些帮助,以及如何解决问题的建议都会很好。要调试代码,我

因此,我被赋予了将两个32位整数交织成一个整数的任务,如下所示:
a_31,…,a_0和b_31,…,b_0,返回包含其交织位的64位长:a_31,b_31,a_30,b_30,…,a_0,b_0。
我尝试通过从每个具有一个在MSB位置具有1的帮助器的对象中获取MSB,然后组合它们来实现这一点。 基本上把“a”int放在奇数位置,“b”int位放在偶数位置。 我不能调用其他函数(即使是Math.pow) 我的代码:


在调试和找出问题方面提供一些帮助,以及如何解决问题的建议都会很好。

要调试代码,我建议在每次迭代过程中逐步完成并写下变量的值。看看他们是否符合你的期望。如果他们不这样做,您就可以准确地找到代码出错的时间和地点


至于有效的解决方案,我建议尽可能简单地考虑。您基本上希望这样:
(减少到8位->16位以提高可读性)

输入:

-------------------------
| 7| 6| 5| 4| 3| 2| 1| 0|
|--|--|--|--|--|--|--|--|
| A| A| A| A| A| A| A| A|
|--|--|--|--|--|--|--|--|
| B| B| B| B| B| B| B| B|
-------------------------
输出:

-------------------------------------------------
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
| A| B| A| B| A| B| A| B| A| B| A| B| A| B| A| B|
-------------------------------------------------
注意所有B位在结果中是如何精确地处于“double”位置的。所有的A位都在“双位”位置,左移一位

因为我们知道位只能是1或0,这基本上可以归结为:对于
b
中的每一位,也就是
1
,我们希望结果在原始位置有一个
1
乘以2。对于
a
中的每一位,也就是
1
我们希望结果是原始位置的
1
乘以2加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 |= 1L << 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 |= 1L << i*2;      // set the bit at position (i*2) in ans to 1
        }
    }
    return ans;
}
公共静态长交织(inta,intb){
长ans=0;
对于(int i=0;i<32;i++)
{

如果((a&(1)要调试您的代码,我建议您在每次迭代中逐步调试并记录变量的值。查看它们是否符合您的预期。如果不符合,则您可以准确地找到代码出错的位置和时间


至于一个可行的解决方案,我建议您尽可能简单地考虑它。您基本上希望:
(减少到8位->16位以提高可读性)

输入:

-------------------------
| 7| 6| 5| 4| 3| 2| 1| 0|
|--|--|--|--|--|--|--|--|
| A| A| A| A| A| A| A| A|
|--|--|--|--|--|--|--|--|
| B| B| B| B| B| B| B| B|
-------------------------
输出:

-------------------------------------------------
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
| A| B| A| B| A| B| A| B| A| B| A| B| A| B| A| B|
-------------------------------------------------
请注意,所有的B位在结果中是如何精确地处于“double”位置的,而所有的A位是如何精确地处于“double”位置的,并向左移动一位

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

可以很容易地转录成代码,如下所示:

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 |= 1L << 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 |= 1L << i*2;      // set the bit at position (i*2) in ans to 1
        }
    }
    return ans;
}
公共静态长交织(inta,intb){
长ans=0;
对于(int i=0;i<32;i++)
{

if((a&(1这可以在没有循环的情况下更有效地完成。诀窍是编写一个helper函数,将位隔开,如
abcd
0a0b0c0d
,然后按位“或”将间隔开的位串组合在一起

将数字隔开的算法如下所示。该示例简化为8位输入,为了可读性,我编写了
而不是
0

  • …abcdefgh
    → <代码>…abcd???efgh
→ <代码>…abcd…efgh
  • …abcd…efgh
    → <代码>.ab??cd..ef??gh→ <代码>.ab..cd..ef..gh
  • .ab..cd..ef..gh
    → <代码>.a?b.c?d.e?f.g?h→ <代码>a.b.c.d.e.f.g.h
  • 每一步都可以通过对左移位副本执行按位“或”来实现。这会使一些位(标记为
    )处于不需要的状态,因此我们使用按位“和”将这些位设置为
    0

    实施:

    公共类交织位{
    公共静态长交织(INTA,INTB){
    
    return(spaceOut(a)这可以在没有循环的情况下更有效地完成。诀窍是编写一个helper函数,将位隔开,如
    abcd
    0a0b0c0d
    ,然后按位“或”将间隔开的位串组合在一起

    将数字隔开的算法如下所示。该示例简化为8位输入,为了可读性,我编写了
    而不是
    0

    • …abcdefgh
      → <代码>…abcd???efgh
    → <代码>…abcd…efgh
  • …abcd…efgh
    → <代码>.ab??cd..ef??gh→ <代码>.ab..cd..ef..gh
  • .ab..cd..ef..gh
    → <代码>.a?b.c?d.e?f.g?h→ <代码>a.b.c.d.e.f.g.h
  • 每一步都可以通过对左移位副本执行按位“或”来实现。这会使一些位(标记为
    )处于不需要的状态,因此我们使用按位“和”将这些位设置为
    0

    实施:

    公共类交织位{
    公共静态长交织(INTA,INTB){
    
    return(spaceOut)(a)“调试方面的一些帮助”逐步完成代码,在纸上写下每次迭代过程中每个变量的二进制值。查看它们何时何地偏离您的预期。找出原因,如果不能,可以自由提问有关具体问题的问题。如果您将其编写为包含8个操作的展开循环,会怎么样?也许这将有助于您了解如何将每个字节从何处移动到何处。这些很可能有助于显示值:
    public static String toString(long i,int-radix)
    public static String toUnsignedString(long i,int-radix)
    。这些可在
    Integer
    long
    上找到(但不是在
    Float
    Double
    )“调试方面的一些帮助”逐步完成代码并写下二进制代码