2の補数とは?2の補数の計算方法と表現範囲をわかりやすく解説!1の補数との違いは?C言語での補数計算プログラムもチェック
基本情報技術者試験でも出題される2の補数
2の補数は、基本情報技術者試験でも出題される範囲に含まれている情報処理関連知識として基本的な部分です。
しかし、その独特な考え方や論理からIT技術に触れた経験が少ない方にとっては最初に立ちはだかる難関といえるかもしれません。
ITのことを勉強しない限りは、基本的に触れることのない分野であり、生活を送っている上で役に立つ知識でもありませんし、常識といえるような内容ではないでしょう。
それだけに、情報処理・IT嫌いになるきっかけになり得るかもしれない分野です。
実際、よく分からないという方や難しいと感じられる方もいます。
とはいえ、考え方を理解さえしてしまえばさほど難しいものではありません。
2の補数について解説
今回はそんな多くの人を苦しめている「2の補数」について解説していきます。
計算方法や表現範囲はもちろん、1の補数と2の補数の違いにまで注目。
1つずつ細かい部分から「2の補数」への苦手意識を克服していきましょう。
2の補数でできることについても注目しています。
そもそも2の補数とは何なのか
それでは順番に2の補数に関する様々な情報を解説していきます。
まずは「そもそも2の補数は何?」というポイントです。
補数表現について
2の補数について知る前に、まず「補数表現」について簡単にチェックしておきましょう。
補数というのは元の数を足したときに桁上がりする「最小」の数のことを指しています。
例えば、10進数の7の補数は3、77の補数は23といった具合です。
先ほど記載した通り「元の数字に足すと次の桁上がりを起こす最小の数字」が「補数」だということが分かります。
減基数の補数
また、減基数の補数というものも存在しています。
先ほど解説したのは「基数の補数」。
対して減基数の補数は「元の数に足して桁上がりを起こさない最大の数」のことを指しています。
つまり先ほど例に挙げた7であれば2、77であれば22になるといった具合です。
こちらも仕組み自体は単純ですね。
10進数の場合は9の補数とされています。
2の補数とは
2の補数は、負の数を2進法(2進数)で表す際に用いられる方法です。
そして「ある特定の数字(2進数)のビットを反転させて、1を足したもの」が元の数の2の補数ということになります。
私たち人間が普段利用している10進数(10進法)では、数字の前に-(マイナス)を付けることで負の数字を表現しています。
しかし、2進法は「0」か「1」で数字を表現するため、負の数であることも同様の方法を用いているということです。
端的にいえば、2の補数は先頭ビット(左端)が「1」である場合に、負の数を表すマイナスの役目を担っています。
何のために存在しているのか
そもそも補数表現というのは「マイナスを使わずに負の数を表現できる」というメリットが存在しています。
つまり「引き算を足し算で表現できる」ことに繋がるということです。
これは結果的にビット操作を行うコンピュータにとって処理を軽くすることにも繋がるため、大きなメリットが得られます。
そのために、IT技術や情報処理関連の勉強をし始めると割と最初の段階で「2の補数」が取り扱われているといえるでしょう。
2の補数についてしっかりと理解をしておけば、人間的な感覚ではなくコンピュータ的な感覚、パソコンがどういった仕組みで動いて演算を行なっているのかを理解できます。
2の補数の計算方法
それでは早速、2の補数の計算方法を確認していきましょう。
今回は分かりやすくするために、4ビットの2進数で計算例を示していきます。
2の補数計算ステップ1:ビットを反転させる
2の補数を計算する際、最初に行うことは「ビットの反転」です。
例えば、0101という2進数(10進数でいう5)があったとします。
このビットを反転、つまり0と1を入れ替えてみましょう。
すると、結果は1010になります。
2の補数計算ステップ2:反転した2進数に1を足す
さて、先ほどの結果「1010」に対して、続いては「1」を足してみます。
この時計算方法は様々ですが、慣れるまでは10進数に置き換えて計算をすると楽です。
1010を10進数で表すと「10」になるので、1を加算すると結果は「11」になります。
そのため「11」を2進数に変換すれば結果は「1011」です。
この「1011」が「0101」の2の補数であるということになります。
記事中で既に触れた通り、2の補数は「2進数のビットを反転させてそれに1を足した数字」です。
そして、それを求める計算は10進数を経由してしまえば実は結構簡単なものであることが分かるでしょう。
もちろん慣れてきてしまえば、10進数を経由せずダイレクトに2進数同士で計算ができるようになっていくはずです。
2の補数の表現範囲は?
さて、2の補数は負の数を表現する手段の1つです。
その2の補数には「表現できる範囲」というものが存在しています。
続いてはその点をチェックしていきましょう。
8ビットの場合の表現可能範囲
一般的に用いられる8ビットの2進数の場合で考えてみます。
8ビットの場合、2の補数表現を用いて表現できる範囲は「-128~127」です。
4ビットの場合の表現可能範囲
4ビットでいえば、「-8〜7」を表現できます。
計算は簡単で、ビット数を「n」とした時に「-2^(n-1)〜2^(n-1)-1」の範囲が表現できます。
ビット数をnに当てはめて2のべき乗を行うだけで範囲を求めることが可能です。
実際に計算してみる
文字列で見ると一見複雑に感じるかもしれませんが、実はシンプル。
4ビットの場合であれば、負の数で表現できるのはnにビット数「4」を代入して、-2^(4-1)、つまり-2の3乗となります。
正の数は同様にnに4を代入して、2^(4-1)-1、つまり2の3乗の結果から1を減算した範囲を計算できます。
それぞれを計算すると、結果は「-8」と「7」になりますね。
先ほどお伝えした「-8(-2の3乗)〜7(2の3乗-1)」という結果が得られることが分かります。
2の補数を利用するメリット
では一体、なぜ2の補数が利用されるのでしょうか。
それは、先ほど少し触れましたが補数表現を利用すれば「加算で減算が表現できる」からです。
コンピュータの世界において、減算よりも加算の方が処理が軽いため、減算に関しても加算を利用して計算を行います。
では一体、どのように加算で減算を行うのでしょうか。
10進数の減算を補数を用いて加算で表現する
まずは、人間でも分かりやすくするために10進数で計算を行なってみましょう。
サンプルとして「433」を例にしてみます。
例えば、433から114、つまり「433-114」という減算を行いたいとしましょう。
通常このまま計算を行えば、結果は「433-114=319」になりますが、今回はこの結果を補数を用いて加算で求めるのが目的です。
引く数の補数を利用して計算を行います。
引く数である114の補数は、桁上がりする最小の数、つまり886です。
この数字を用いて「433+886」という加算を行ってみると「433+886=1,319」となります。
さて、既にお気付きかとは思いますが、下3桁が通常通り計算した「319」で一致していますね。
この結果を見ると、最上位の桁を取り除けば加算でも減算と同様の結果が得られることが分かります。
2進数で減算を加算で表現する
それでは、2進数の場合はどうなるのでしょうか。
基本的な流れは同様です。
まずは補数を求める
例えば4ビットの「0111(10進数では7)」から「0110(10進数では6)」を引くという場合で考えてみます。
まずは先ほど解説した流れの通り、2の補数を求めていきます。
引く数である0110のビットを反転させて「1001」にし、1を加えると「1010」になります。
これで、引く数「0110」に対応する2の補数が1010であることが求められました。
実際に加算を行ってみる
では実際に加算を行います。
0111と1010を加算すると、桁上がりが起きて本来であれば「0111+1010=10001」となります。
しかし桁上がりを無視してみると、結果は「0111+1010=0001」になりますね。
正しい解答が得られていることが分かります。
2進数同士の計算だと分からない方も多いかもしれませんので、10進法で見てみます。
今回行いたかった計算は、10進法でいえば「7-6」です。
そして、最後に得られた桁上がりを無視した解答は「0001」、つまり「1」です。
「7-6」は当然「1」という結果になります。
減算が加算で表現できる
つまり、2進法で2の補数を用いて「減算を加算で表現」した結果は正しいことが分かりますね。
このように、2の補数を用いることで減算の正しい結果を加算だけで得られます。
コンピュータの世界では非常に重要かつ便利な方法だということです。
処理を軽くでき、実行速度も上昇させることに繋がります。
基礎的な部分だからこそ、ITパスポートや基本情報技術者試験といったいわば登竜門的な資格試験の試験範囲に含まれ、問われることの多い分野であるということです。
1の補数との違い
さて、2の補数について学んだ方は、知らぬ間に「1の補数」にも触れているということにお気づきの方はいらっしゃるでしょうか。
実は、2の補数を計算する過程で「1の補数」が登場しています。
実はステップ1で登場していた1の補数
それが「ビットを反転させる」という作業です。
先ほど例として出てきた「0101」のビットを反転させると「1010」になりますが、これが1の補数だということになります。
これは「元の数に足して桁上がりを起こさない最大の数」だということも頭に留めておきましょう。
違いはシンプル
1の補数と2の補数の違いはシンプルだということに気づかれた方も多いでしょう。
1の補数は「桁上がりをしない」数、つまり減基数です。
そして2の補数は「桁上がりをする」数になります。
覚え方も単純で「ビット反転したら1の補数」で「ビット反転に1を足したら2の補数」という具合に覚えられるかもしれません。
C言語での補数計算プログラムを組んでみる
それでは少し実践的な内容として「プログラム」という観点から「2の補数」をチェックしてみましょう。
C言語を利用した補数を計算するプログラムを組んでみてください。
もしプログラミングを練習中、勉強中という方、特に始めたばかりという方には少し難易度が高い問題かもしれません。
それでも、まずは解答を見ずに自分で解いてみるのが大切です。
じっくりとインターネットや参考書などを利用して調査して組んでみましょう。
試行錯誤しながらでもとにかく問題を解こうとあれこれコーディングするのが、プログラミングの技術やスキルを身に着け、スキルアップするために最も重要なプロセスです。
面倒くさがらずに取り組んでみるのが大切といえます。
2の補数は決して難しいものではない
今回の記事では、2の補数という分野について解説をしてきました。
普段の生活ではまず触れることのない2の補数ですが、少し考えてみるとそれほど難しいものではないことが分かったのではないでしょうか。
2の補数は、決して複雑で意味不明なものではありません。
基本的に「2の補数」は僅か2ステップで求めることができます。
まず、求めたい2進数の数字をビット反転(0と1を入れ替える)してください。
そうしたら、ビット反転した数字に「1」を足してください。
この流れは、どんなに桁が多くなっても同じです。
今回の記事では分かりやすくするために4ビットを例えとして利用しましたが、実際には8ビットの2進数を目にする機会が多くなるでしょう。
実際の問題なども8ビットで出題される可能性が考えられます。
それでも、桁数は関係ありません。
「ビット反転して、1を足す」という流れを頭に叩き込んでおきましょう。
2の補数は基本
2進数だけで考えるのが難しければ、10進数を経由しても全く問題ありません。
特に最後の「1を足す」という部分に関しては、10進数を経由した方が分かりやすく間違い防ぎやすい部分ともいえます。
ぜひ躊躇わずに10進数を経由して考えてみてください。
そうすれば、2の補数への苦手意識を減らすことができるでしょう。
2の補数はコンピュータの理論において基礎的な部分ともいえる内容です。
ぜひ今回解説させて頂いた部分や計算方法などを覚え、2の補数の計算方法や、1の補数との違いまで理解を深めておきましょう。
toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。
エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。