-1

この問題http://www.geeksforgeeks.org/find-two-non-repeating-elements-in-an-array-of-repeating-elements/に Method2 を実装したいのですが、問題が 1 つあります。配列の数値を2つのグループ(バイナリ表現の指定された位置に「1」があるグループとないグループ)に分割する方法がわかりません。配列内のInteger.toBinaryString()各数値に使用する必要があると思いました次の方法:

private static boolean hasOne(int number, int i) {
    String s = Integer.toBinaryString(number);
    if(s.charAt(i) == '1')
        return true;
    return false;
}

しかし、問題は、バイナリ表現ですべての数値が同じ長さであるとは限らず、メソッドが正しく機能しないことです。どうすればこれを処理できますか? つまり、パディングをどのように処理できますか?

4

3 に答える 3

0

バイナリに明示的に変換してそこで設定されたビットを見つけるという追加の手順を実行するのに問題があるため、提供されたコードは単に Java に移植されることを知っておいてください。これは主にビット単位の操作であるためです。

public static void main (String[] args)
{
    int arr[] = {2, 3, 7, 9, 11, 2, 3, 11};
    int xor = 0;
    for (int i = 0; i < arr.length; i++) {
        xor ^= arr[i];
    }
    int set_bit_no = xor & ~(xor-1);
    int x = 0, y = 0;
    for (int i = 0; i < arr.length; i++) {
        if ((arr[i] & set_bit_no) != 0) {
            x ^= arr[i];
        } else {
            y ^= arr[i];
        }
    }
    System.out.println(x); // prints 7
    System.out.println(y); // prints 9
}
于 2014-07-07T15:48:02.247 に答える
0

String.formatまず、バイナリ文字列をとの組み合わせでパディングできますreplace

String s = String.format("%32s", Integer.toBinaryString(number)).replace(' ', '0');

また、ビットごとの演算子を使用して、特定の数値のバイナリ表現の特定の場所に 1 があるかどうかを判断することもできます。

たとえば、2 進数の 10 進数を考えてみましょx = 2010100。さらに、2 進数の右から 3 番目の位置に 1 があるかどうかを判別するとしますn = 3。ビット シフト>>を使用して、バイナリ シーケンスを右に 2 回シフトし、 1 でn - 1マスクすることができます&

結果の式は のよう(20 >> 2) & 1になり、右から 3 番目のスポットに実際に 1 がある場合は 1 に評価され、そうでない場合は 0 に評価されます。この場合、1 と評価されます。

したがって、これをさらに一般化して次のようにすることができます。

private static boolean hasOne(int number, int i) {
    return ((number >> (i - 1)) & 1) == 1;
}

Java チュートリアルで、ビットごとの演算子とビットシフト演算子について詳しく学ぶことができます。

于 2014-07-07T15:49:46.017 に答える