-
11-10-2019 - |
質問
差し引くつもりだ:0000 0000-(-1)
つまり:(2つの補完)
0000 0000
- 1111 1111
---------
= ???? ????
何が起こるのか、私の脳は本当に私と一緒にいます。それは以前に完全にうまくいきました。
解決
2人のサブトラヘンドの補完を取り、それをminuendに追加します。
0000 0000
- 1111 1111
...
0000 0000
+ 0000 0001
-----------
0000 0001
他のヒント
それは(-11..11)になります。小数と同じように、サインはまだ標識であり、(0-x)は、単純な減算ではなくビットワイズ操作を使用していない限り、まだ(-x)です。
1(バイナリ0000 0001)である2つの補体を追加することにより、-1(バイナリ1111 1111)を減算できます。したがって、10進数では、0-( - 1)= 0+1 = 1 :-)
ハードウェアが行う方法は、2番目のオペランドを反転させ、キャリーを最小重要なビットレーンに1に追加して追加します。オペランドはノットであり、キャリーインセット。
鉛筆と紙のスタイルを行うことができます。ここで、その隣の数字から借りますが、小数点と比較して少し間抜けに感じます。 10進数では、1000マイナス1が右側のゼロが10になります。これはベース10であるため、隣の0は10になりますが、右に1つ貸し出します。一番上の列が9 9 10になるまで続き、0 0 1を差し引き、999を取得します。ベース2 0B1000(8桁)マイナス0B0001では、同じことが左から右の借用が2または0B10になります。これはベース2であり、その隣のゼロは0B10になり、1つを右に貸して1にする必要があります。列と0B111または7小数を取得します。
したがって、すべてのZerosからすべてのものを差し引いて、一番上の行は1 1 1 1 1 1 1 1 0B10です最初の借入後、一番下行は0 0 0 0 0 0 0にとどまり、列を減算すると0 0 0 0 0 0 0を取得します0 1。
私の直感は私にそれを教えてくれます 0 - (-1)
に等しい必要があります 0+1
、または単に 1
.
なぜ疑問に思うなら、減算ビットを少し実行してみてください。
0 - 1 = 10 - 1 = 1, setting borrow to 1.
0 - 1 - borrow = 10 - 1 - 1 = 0, borrow = 1
etc..
そして、手でバイナリ減算を行うことをよりよく避けてください。 2Sの補完のアイデアは、代わりに相互に追加することにより、減算を実行する簡単な方法を提供することです。