私の知る限り、2の補数は次のとおりです。
1.小数を2進数で表します。
2.すべてのビットを反転します。
3.最後のビットに1を追加します。
3その表現である数の場合0000000000000011、2の補数の結果は次のよう1111111111111101になります-3。
ここまでは順調ですね。しかし、2その表現が00000000000000102の補数の結果である数は、 11111111111111012ではなく-3になります。
私は何が間違っているのですか?
私の知る限り、2の補数は次のとおりです。
1.小数を2進数で表します。
2.すべてのビットを反転します。
3.最後のビットに1を追加します。
3その表現である数の場合0000000000000011、2の補数の結果は次のよう1111111111111101になります-3。
ここまでは順調ですね。しかし、2その表現が00000000000000102の補数の結果である数は、 11111111111111012ではなく-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を実行します。
それがお役に立てば幸いです!
0...0010 // 2
1...1101 // Flip the bits
1...1110 // Add one
それはネガティブにも機能します:
1...1110 // -2
0...0001 // Flip the bits
0...0010 // Add one
私は何が間違っているのですか?
2番目の例のステップ3をスキップします(または誤解します)。
11111111111111011の補数です2(つまり、ステップ1と2の結果)。1を追加する必要があります-最後のビット(2進数のように)ではなく、最後の結果(ステップ2から得られるもののように)に。