そのため、次のように、2 つの 32 ビット整数を 1 つにインターリーブするタスクが与えられ
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 の場所に 1 を持つヘルパーを使用して、それぞれから MSB を取得し、それらを結合することで試してみました。基本的に、"a" int を奇数の場所に配置し、"b" int ビットを偶数の場所に配置します。
他の関数を呼び出すことはできません (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
問題を解決する方法の提案と同様に、デバッグと問題の解明の助けになるとよいでしょう。