2

したがって、数値1と別の数値2 ..両方の整数がある場合、ビット演算を使用して2つの数値を加算することで、私のアプローチは修正されますか?これはどのテストケースでもうまくいかない可能性がありますか?

public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
4

4 に答える 4

11

全加算器

回路設計者が 2 つの数値を加算する方法を次に示します。変換すると、左端が二重に湾曲している上部の 2 つの記号は XOR (^)、左端が平らな中央の 2 つの記号は AND (&)、左端が 1 つ湾曲している最後の 2 つの記号は OR (|) です。 )。

では、マスクを使用して、一度に 1 ビットずつコードに変換する方法を次に示します。

public int add(final int A, final int B) {
    int mask = 1; 
    int sum = 0;
    int carry = 0;

    for (int i = 1; i <= Integer.SIZE; i++) { //JVM uses 32-bit int
        int a = A & mask; //bit selection
        int b = B & mask;

        //sum uses |= to preserve the history,
        //but carry does not need to, so it uses =
        sum |= a ^ b ^ carry; //essentially, is the sum of bits odd?
        carry = ((a & b) | ((a ^ b) & carry)) << 1; //are exactly two of them 1?

        mask <<= 1; //move on to the next bit
    }
    return sum;
}
于 2012-09-04T05:11:24.410 に答える
7

はい。このアプローチは、複数のキャリーを含む加算には機能しません。そのような最も単純なケースは次のとおりです3 + 1。あなたの関数は0結果として与えます。

これを解決する単純な一般的な解決策はありません。どの解決策も整数の幅を考慮に入れる必要があります。いくつかのアプローチについては、加算のゲートレベルの実装に関するウィキペディアの記事を参照してください。

于 2012-09-04T04:51:53.637 に答える