Java 将2个32位整数交织成64位整数
因此,我被赋予了将两个32位整数交织成一个整数的任务,如下所示: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) 我的代码: 在调试和找出问题方面提供一些帮助,以及如何解决问题的建议都会很好。要调试代码,我
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
)“调试方面的一些帮助”逐步完成代码并写下二进制代码