![見出し画像](https://assets.st-note.com/production/uploads/images/153100292/rectangle_large_type_2_6bf4eb65c6df6c7ed264af0055cc4e13.jpg?width=1200)
引き算を足し算で行う
引き算を足し算で行える。この話を聞いたのは確か15歳の頃ですが、手品のように感じたものです。
どうやるかというと、まず、10進数を2進数に変換します。例えば13-6なら1101-0110に書き換えます。
次に引きたい数をビット反転させます。1001。そして1を足します。1010。
これを足すと、10111になります。上位1ビットを無視すると0111になります。10進数の7です。13-6=7を足し算で計算できました。
何をしたかというと、2進数の引き算を行う際、実際には引き算を直接行うのではなく、「補数」を使って足し算に変換して操作しました。
補数とは、ある数値に対してそれを基数の全体から引いた値のことです。2進数の場合には、1の補数と2の補数の2つの考え方があります。1の補数は、各ビットを反転させることで得られます。たとえば、2進数「0110」があるとします。この1の補数は「1001」です。つまり、ビットの0は1に、1は0に反転します。次に、2の補数は1の補数にさらに「1」を足したものです。前述の例でいえば、「1001」に1を足して「1010」が2の補数になります。この2の補数を使うことで、引き算を足し算に変換できるのです。
コンピュータが足し算の方が高速で効率的に実行できるので実際の処理でも内部ではこの操作が行われています。
引き算専用の回路を追加することも原理的に可能ですが、計算効率やエラーのリスク低減のために、足し算の回路に特化する方が便利なので、こうした変換が用いられているのです。
同様に、掛け算を足し算に変換して処理することができます。桁をずらして足していくのです。これもハードウェアとソフトウェアの連携を感じる基礎的な例です。