リンドくん先生、プログラミング勉強してたら「2進数」とか「16進数」って言葉をよく見かけるんですけど、これって何なんですか?
たなべコンピュータの世界では、普段僕たちが使っている10進数とは違う数の表し方をしているんだ。
今日は、コンピュータがどうやって数を扱っているのかを一緒に学んでいこう。
プログラミングを学び始めると、必ず出会うのが「2進数」という概念です。
「0b1010」や「0xFF」といった見慣れない数の表記を見て、戸惑った経験はありませんか?
本記事では、プログラミングの基礎となる2進数の仕組みと、異なる数の表し方(基数)を変換する方法について、初心者の方でも理解できるよう丁寧に解説していきます。
コンピュータがなぜ2進数を使うのか、10進数から2進数への変換はどうやるのか、そして実際のプログラミングでどう活用されているのか。
これらの疑問に、ゲームの例えも交えながら、わかりやすくお答えしていきましょう。
そもそも「進数」って何?普段使っている数の正体
リンドくん普段使っている数字も「10進数」って呼ばれるんですか?
たなべその通り!僕たちが普段使っているのは10種類の数字(0〜9)を使う10進数なんだ。
でも実は、数の表し方は10進数だけじゃないんだよ。
進数とは何か
進数とは、数を表現するときに使う「基数(位が変わるときに基準となる数)」のことです。
もっと簡単に言うと、何種類の数字を使って数を表すかを決める仕組みです。
私たちが日常的に使っている数は10進数(Decimal)と呼ばれます。
これは0から9までの10種類の数字を使って、すべての数を表現する方法です。
たとえば「123」という数字は、10進数では以下のように成り立っています。
- 100の位:1 × 100 = 100
- 10の位:2 × 10 = 20
- 1の位:3 × 1 = 3
- 合計:100 + 20 + 3 = 123
各桁が「10のn乗」で重みづけされているため、10進数と呼ばれるのです。
なぜ10進数を使っているのか
人間が10進数を使っている理由は、おそらく指が10本あるからだと言われています。
古代から人々は指を使って数を数えてきたため、自然と10を基準とした数え方が定着したのです。
しかし、コンピュータには「指」がありません。
コンピュータが理解できるのは、「電気が流れている」か「流れていないか」の2つの状態だけです。
そのため、コンピュータの世界では2進数が使われるようになったのです。
コンピュータが2進数を使う理由
リンドくんなんでコンピュータは2進数を使うんですか?10進数じゃダメなんですか?
たなべいい質問だね!コンピュータの中身を考えると、その理由がよくわかるんだ。
コンピュータは電気のON/OFFで動いているからなんだよ。
電気のON/OFFが2進数の基本
コンピュータの内部では、すべての情報が電気信号で表現されています。
電気が流れている状態を「1」、流れていない状態を「0」として扱います。
この0と1の2種類だけを使って数を表す方法が2進数なのです。
たとえば、スイッチを想像してみてください。
- スイッチがONの状態 → 1
- スイッチがOFFの状態 → 0
このスイッチを複数個並べることで、様々な数を表現できます。
スイッチ4個の例:
ON OFF ON ON → 1011(2進数)
OFF ON OFF ON → 0101(2進数)
2進数の利点
2進数には以下のような利点があります。
- シンプルで確実 → 2つの状態だけなので、誤認識が少ない
- 回路設計が簡単 → ON/OFFだけで良いので、電子回路が単純になる
- 高速処理が可能 → 複雑な計算も基本的なON/OFF操作に分解できる
- ノイズに強い → 中間的な状態がないため、多少のノイズでは誤動作しない
ゲームで例えるなら、「攻撃が当たった/外れた」という2つの状態だけで判定するようなものです。
「50%当たった」という中途半端な状態がないため、判定が明確でわかりやすいですよね。
2進数の基本的な仕組み
リンドくん2進数って、実際にはどうやって数を表すんですか?
たなべ10進数と同じように、桁が上がるごとに重みが変わるんだけど、10進数が10倍ずつ増えるのに対して、2進数は2倍ずつ増えるんだよ。
2進数の桁の重み
2進数では、各桁が「2のn乗」の重みを持ちます。
たとえば、2進数の「1101」を10進数に変換してみましょう。
2進数: 1101
右から順に:
1 × 2³ = 1 × 8 = 8
1 × 2² = 1 × 4 = 4
0 × 2¹ = 0 × 2 = 0
1 × 2⁰ = 1 × 1 = 1
合計: 8 + 4 + 0 + 1 = 13(10進数)
このように、右端から左に向かって、1の位、2の位、4の位、8の位...と増えていくのが2進数の特徴です。
2進数の数え方
2進数で数を数えてみましょう。
10進数 → 2進数
0 → 0
1 → 1
2 → 10 (2になったら桁が上がる)
3 → 11
4 → 100 (また桁が上がる)
5 → 101
6 → 110
7 → 111
8 → 1000 (さらに桁が上がる)
10進数では9の次に桁が上がりますが、2進数では1の次に桁が上がるという違いがあります。
ビットとバイト
2進数の1桁のことをビット(bit)と呼びます。
そして、8ビットをまとめたものをバイト(byte)と呼びます。
1ビット: 0 または 1
8ビット(1バイト): 00000000 〜 11111111
1バイトで表現できる数の範囲は、0から255まで(合計256通り)です。
これは、ゲームでキャラクターのレベルやHP、アイテムの個数などを管理するときに、よく使われるサイズなんです。
10進数から2進数への変換方法
リンドくん10進数の数を2進数に変換するには、どうすればいいんですか?
たなべいくつか方法があるんだけど、2で割り続ける方法が一番わかりやすいかな。
実際にやってみよう!
2で割り続ける方法
10進数を2進数に変換する最も一般的な方法は、2で割り続けて余りを記録する方法です。
例として、10進数の「13」を2進数に変換してみましょう。
13 ÷ 2 = 6 余り 1 ←一番右のビット
6 ÷ 2 = 3 余り 0
3 ÷ 2 = 1 余り 1
1 ÷ 2 = 0 余り 1 ←一番左のビット
余りを下から順に読むと: 1101
このように、商が0になるまで2で割り続け、余りを逆順に並べることで、2進数に変換できます。
もう一つの例
もう少し大きな数でも試してみましょう。10進数の「42」を2進数に変換します。
42 ÷ 2 = 21 余り 0
21 ÷ 2 = 10 余り 1
10 ÷ 2 = 5 余り 0
5 ÷ 2 = 2 余り 1
2 ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
余りを下から順に: 101010
したがって、10進数の「42」は、2進数では「101010」となります。
検算してみよう
正しく変換できたか、確認してみましょう。
2進数: 101010
1 × 2⁵ = 32
0 × 2⁴ = 0
1 × 2³ = 8
0 × 2² = 0
1 × 2¹ = 2
0 × 2⁰ = 0
合計: 32 + 8 + 2 = 42 ✓
しっかり元の数に戻りましたね!
2進数から10進数への変換方法
リンドくん逆に、2進数を10進数に戻すのはどうすればいいんですか?
たなべこれは比較的簡単だよ。各桁の重みを掛けて足し算するだけなんだ。
各桁の重みを使った変換
2進数から10進数への変換は、各桁の値に重みを掛けて合計する方法が基本です。
例として、2進数の「11010」を10進数に変換してみましょう。
2進数: 11010
右から順に(2の0乗から始まる):
0 × 2⁰ = 0 × 1 = 0
1 × 2¹ = 1 × 2 = 2
0 × 2² = 0 × 4 = 0
1 × 2³ = 1 × 8 = 8
1 × 2⁴ = 1 × 16 = 16
合計: 16 + 8 + 0 + 2 + 0 = 26(10進数)
覚えておきたい2の累乗
変換をスムーズに行うために、以下の2の累乗を覚えておくと便利です。
2⁰ = 1
2¹ = 2
2² = 4
2³ = 8
2⁴ = 16
2⁵ = 32
2⁶ = 64
2⁷ = 128
2⁸ = 256
これらの数字は、プログラミングやゲーム開発でも頻繁に登場します。
たとえば、ゲームで最大HPが255までという制限があるのは、1バイト(8ビット)で表現できる最大値だからなんです。
16進数とは?プログラミングでよく使う表記法
リンドくん先生、「16進数」っていうのも見かけるんですけど、これは何なんですか?
たなべ16進数は、16種類の記号を使って数を表す方法なんだ。
プログラミングでは、2進数をもっと読みやすくするために使われることが多いんだよ。
16進数の基本
16進数(Hexadecimal)は、0から9までの数字に加えて、AからFまでのアルファベットを使って数を表現します。
10進数 → 16進数
0 → 0
1 → 1
...
9 → 9
10 → A
11 → B
12 → C
13 → D
14 → E
15 → F
16 → 10
なぜ16進数を使うのか
16進数が便利な理由は、2進数4桁がちょうど16進数1桁に対応するからです。
2進数 → 16進数
0000 → 0
0001 → 1
0010 → 2
...
1001 → 9
1010 → A
1011 → B
1100 → C
1101 → D
1110 → E
1111 → F
たとえば、2進数の「11111111」は、16進数では「FF」と表記できます。
これにより、長い2進数をコンパクトに表現できるのです。
プログラミングでの16進数
プログラミングでは、16進数は以下のような場面で使われます。
カラーコード
#FFFFFF → 白色
#FF0000 → 赤色
#00FF00 → 緑色
#0000FF → 青色
メモリアドレス
0x0000 〜 0xFFFF
ビット演算やフラグ管理
# Pythonでの16進数の例
color = 0xFF0000 # 赤色
mask = 0x0F # 下位4ビットのマスクプログラミング言語では、16進数を表すときに「0x」という接頭辞をつけることが一般的です。
プログラミングでの活用例
リンドくん実際のプログラミングでは、どんな場面で2進数や16進数を使うんですか?
たなべ意外といろんな場面で使われているんだよ。
特にビット演算や権限管理、色の表現なんかでよく使うんだ。
ビット演算の例
ビット演算は、2進数の各ビットを直接操作する処理です。
ゲーム開発では、キャラクターの状態管理などによく使われます。
# Pythonでのビット演算の例
# キャラクターの状態をビットで管理
POISONED = 0b0001 # 毒状態
PARALYZED = 0b0010 # 麻痺状態
SLEEPING = 0b0100 # 睡眠状態
CONFUSED = 0b1000 # 混乱状態
# キャラクターの現在の状態
character_status = 0b0000
# 毒状態を付与
character_status = character_status | POISONED # 0b0001
# 麻痺状態も追加
character_status = character_status | PARALYZED # 0b0011
# 毒状態かどうかチェック
if character_status & POISONED:
print("キャラクターは毒状態です!")このように、1つの変数で複数の状態を同時に管理できるのがビット演算の強みです。
色の表現
Webやゲーム開発では、色を16進数で表現することが一般的です。
# RGBカラーの16進数表現
# 各色が0〜255(00〜FF)の範囲
white = 0xFFFFFF # 赤255, 緑255, 青255
red = 0xFF0000 # 赤255, 緑0, 青0
green = 0x00FF00 # 赤0, 緑255, 青0
blue = 0x0000FF # 赤0, 緑0, 青255
# 色の成分を取り出す
color = 0xFF8040
red_component = (color >> 16) & 0xFF # 255
green_component = (color >> 8) & 0xFF # 128
blue_component = color & 0xFF # 64権限管理の例
ファイルやシステムの権限管理でも、ビット演算が活用されています。
# ファイル権限の例(Unixシステムなど)
READ = 0b100 # 読み取り権限
WRITE = 0b010 # 書き込み権限
EXECUTE = 0b001 # 実行権限
# 読み書き権限を持つユーザー
user_permission = READ | WRITE # 0b110
# 読み取り権限があるかチェック
if user_permission & READ:
print("読み取り可能です")
# 実行権限があるかチェック
if user_permission & EXECUTE:
print("実行可能です")
else:
print("実行できません")基数変換を素早く行うコツ
リンドくん基数変換って、慣れないと時間がかかりそうですね...
たなべ最初はそうだけど、よく使う数字のパターンを覚えるとグッと楽になるんだ。
あとは、プログラミング言語の機能を使うのも手だよ。
よく使う変換パターンを覚える
以下のような変換は頻繁に使うので、覚えておくと便利です。
10進数 → 2進数 → 16進数
0 → 0000 → 0
1 → 0001 → 1
2 → 0010 → 2
4 → 0100 → 4
8 → 1000 → 8
15 → 1111 → F
16 → 10000 → 10
255 → 11111111 → FF
プログラミング言語での変換
実際のプログラミングでは、言語の組み込み機能を使って変換できます。
# Pythonでの基数変換
# 10進数 → 2進数
num = 42
binary = bin(num) # '0b101010'
print(binary)
# 10進数 → 16進数
hexadecimal = hex(num) # '0x2a'
print(hexadecimal)
# 2進数の文字列 → 10進数
binary_str = '101010'
decimal = int(binary_str, 2) # 42
print(decimal)
# 16進数の文字列 → 10進数
hex_str = '2a'
decimal = int(hex_str, 16) # 42
print(decimal)
# フォーマット指定で出力
num = 255
print(f"10進数: {num}") # 10進数: 255
print(f"2進数: {bin(num)}") # 2進数: 0b11111111
print(f"16進数: {hex(num)}") # 16進数: 0xff電卓ツールの活用
多くのOSには、プログラマ向け電卓が用意されています。
- Windows: 電卓アプリの「プログラマー」モード
- Mac: 計算機アプリの「プログラマ」表示
- Linux: galculator、gcalctoolなど
これらのツールを使えば、瞬時に基数変換ができます。
まとめ
リンドくん2進数や16進数の仕組みがだいぶわかってきました!
コンピュータの世界って、思ったより身近なんですね。
たなべそう思ってもらえると嬉しいな!
最初は難しく感じるかもしれないけど、コンピュータの基本的な仕組みを理解することは、プログラミングスキル向上にとても役立つんだよ。
この記事では、プログラミングの基礎となる2進数と基数変換について解説してきました。
ここで重要なポイントをおさらいしましょう。
2進数と基数変換の重要ポイント
- 10進数は0〜9の10種類、2進数は0と1の2種類、16進数は0〜9とA〜Fの16種類の記号を使う
- コンピュータが2進数を使うのは、電気のON/OFFで表現できるから
- 2進数の各桁は「2のn乗」、16進数の各桁は「16のn乗」の重みを持つ
- 16進数は2進数4桁に対応するため、長い2進数を簡潔に表現できる
- プログラミングでは、ビット演算、色の表現、権限管理などで活用される
プログラミングを学ぶ上で、コンピュータがどのように動いているのかを理解することは非常に重要です。
2進数や基数変換は、その第一歩となる基礎知識なのです。
最初は複雑に感じるかもしれませんが、実際にプログラムを書きながら使っていくうちに、自然と身についていきます。
ぜひ今回学んだ知識を活かして、より深いプログラミングの世界に踏み出してみてください。





