質問

差し引くつもりだ: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の補完のアイデアは、代わりに相互に追加することにより、減算を実行する簡単な方法を提供することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top