1

私の知る限り、2の補数は次のとおりです。

1.小数を2進数で表します。
2.すべてのビットを反転します。
3.最後のビットに1を追加します。

3その表現である数の場合0000000000000011、2の補数の結果は次のよう1111111111111101になります-3
ここまでは順調ですね。しかし、2その表現が00000000000000102の補数の結果である数は、 11111111111111012ではなく-3になります。
私は何が間違っているのですか?

4

3 に答える 3

3

あなたのコードでは、2の補数を実行する必要があるかもしれません:私はこれをそこに捨てたかっただけです(負のバイナリを取得するより速い方法):

2の補数は、バイナリの値を見つけるのに非常に役立ちますが、そのような問題を解決するためのはるかに簡潔な方法を考えました(他の誰もそれを公開しているのを見たことがありません):

バイナリを考えてみましょう。たとえば、1101は、[スペース「1」が符号であると仮定して] -3に等しくなります。

2の補数を使用して、これを実行します...1101を0010に反転...0001 + 0010を追加===>は、正の2進数=3の0011.0011になります。したがって、1101 = -3

私が気づいたこと:

すべての反転と加算の代わりに、正のバイナリ(たとえば0101)を解くための基本的な方法は(2 3 * 0)+(2 2 * 1)+(2 1 * 0)+(2 0 * 1)=5。

ネガティブでまったく同じコンセプトを実行してください!(少しひねりを加えて)

たとえば、1101を取り上げます。

2 3 * 1 = 8の代わりに最初の数については、-(2 3 * 1)= -8を実行します

次に、通常どおり続行し、-8 +(2 2 * 1)+(2 1 * 0)+(2 0 * 1)= -3を実行します。

それがお役に立てば幸いです!

于 2013-06-22T19:53:14.473 に答える
1
0...0010 // 2
1...1101 // Flip the bits
1...1110 // Add one

それはネガティブにも機能します:

1...1110 // -2
0...0001 // Flip the bits
0...0010 // Add one
于 2012-12-06T01:25:49.667 に答える
0

私は何が間違っているのですか?

2番目の例のステップ3をスキップします(または誤解します)。

11111111111111011の補数です2(つまり、ステップ1と2の結果)。1を追加する必要があります-最後のビット(2進数のように)ではなく、最後の結果(ステップ2から得られるもののように)に。

于 2012-12-06T01:20:27.210 に答える