ITエンジニアの “いろは” と言って良いと思います。2進数・16進数について語ります。
2進数・10進数・16進数
次の表は4ビットで表すことができる値を 2進数・10進数・16進数 で一覧にしたものです。ITエンジニアを目指す人ならこれは丸暗記しましょう。特に赤文字の 0000(0)、0001(1)、0111(7)、1111(15) はビジネスの実務では毎日出てきますので必須です。小学生が九九を暗記するのと同じです。
丸暗記が難しければ、どのような構造になっているか理解すれば一瞬で思い出すことが出来ます。N桁の2進数なら、下の桁(右端の桁)から順に 0 〜 2(N-1) の順に並んでいます。その合計が意味する数になります。例えば 2進数 の “1111” は 1+2+4+8 なので10進数の 15 を意味します。
「16進数のAは2進数では何?」と聞かれたら、「Aは10、10は8+2だから、2進数では1010」と頭の中で瞬時に変換すれば思い出せます。「16進数のEは?」と聞かれたら、「Fよりひとつ小さいから14、2進数なら1110」と連想できます。
2進数、10進数、16進数が自由自在に変換できることが必要です。
2のN乗
次は2のN乗です。これも丸暗記しましょう。エンジニア同士なら「いちにっぱ」、「にごろ」、「ごーいちに」という言い方も日常的に使われます。
210 は 1024 です。ちょうど 1000 ではありませんが、これを 1k(1キロ)と言う場合もあります。「1キロ」と言ったときに 1000 と 1024 のどちらを意味するかは文脈に依存します。220 は 1キロ✕1キロなので「1メガ」、230 は「1ギガ」です。パソコンのカタログなどで、「1GB=1,073,741,824バイト」等と注記されているものがありますが、これは 1k=1024 なのか 1k=1000 で換算しているのかを明示するためのものです。
プログラミングとの関係
プログラミング言語と環境に依存しますが、整数の値を4バイトで扱う処理系があると仮定しましょう。4バイトで表現できる最大の数はいくつでしょうか?
4バイトは 4 ✕ 8 = 32 ビット ですので、表現できる最大の値は 232 -1 です。数の範囲は 0 で始まり、232 で桁あふれが発生する直前までなので「-1」が付いています。さて、これは幾つでしょうか? 先ほどの表で は 230 は約10億でした。232 = 230 ✕ 22 なので約40億です。これは符号無し整数の場合で、符号付き整数の場合は符号ビットに1ビット使いますのでその半分が表現できる最大値になります。およそ20億、正確には 2,147,483,647 です。
競技プログラミングの問題で、扱う数値の上限として「N < 109」というような条件が示されることがあります。これは4ビットの整数どうしを足し合わせても4ビットの整数で表現できることが背景です。さらに大きな値を扱うためにはデータ型の考慮が必要になることが判断できます。