1

そのため、次のように、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

問題を解決する方法の提案と同様に、デバッグと問題の解明の助けになるとよいでしょう。

4

2 に答える 2