一覧へ

2進法と計算思考

コンピュータがなぜ0と1だけを使うのか、ビットとバイトの意味、テキストと色の2進表現を理解します。

入門
|
10
|
検証済み (2026-07)
2進法ビットバイト2進数コンピュータ表現
進捗0/23 (0%)

2進数とコンピューティング思考

このトピックを終えると

コンピュータがなぜ2進数を使うのかを理解し、10進数と2進数の変換ができ、テキストや色が内部的にどのように表現されるかを説明できるようになります。


なぜコンピュータは0と1だけを使うのか

コンピュータの中核部品であるトランジスタは、2つの状態しか持たず、電流が流れる(1)か、流れない(0)かのどちらかです。数十億個のトランジスタが集まってCPUを構成し、それぞれが0または1を表現します。

人間は指が10本あるため10進数を使います。コンピュータは状態が2つあるため2進数を使います。それだけです。


10進数 vs 2進数

10進数で254は:

text
2 × 10² + 5 × 10¹ + 4 × 10⁰
= 200   + 50     + 4
= 254

2進数で11111110は:

text
1×2⁷ + 1×2⁶ + 1×2⁵ + 1×2⁴ + 1×2³ + 1×2² + 1×2¹ + 0×2⁰
= 128 + 64   + 32   + 16   + 8    + 4    + 2    + 0
= 254

同じ原理です。桁ごとに10の累乗ではなく、2の累乗を掛けます。

Pythonで変換

python
# 10進数 → 2進数
print(bin(254)) # '0b11111110'
print(bin(42)) # '0b101010'
# 2進数 → 10進数
print(int('11111110', 2)) # 254
print(int('101010', 2)) # 42
# 16進数(2進数の省略)
print(hex(254)) # '0xfe'
print(int('fe', 16)) # 254

0bは2進数、0xは16進数を表す接頭辞です。


ビットとバイト

  • ビット(bit):0または1、情報の最小単位
  • バイト(byte):8ビット = 1バイト
text
1 bit   → 2つの値     (0または1)
2 bits  → 4つの値     (00, 01, 10, 11)
3 bits  → 8つの値     (000 ~ 111)
8 bits  → 256つの値   (00000000 ~ 11111111)

nビットで表現できる値の個数は2ⁿです。

単位サイズおおよその用途
1 byte8 bits英字1文字
1 KB1,024 bytes短いテキストファイル
1 MB1,024 KB高解像度写真1枚
1 GB1,024 MB映画1本(SD)
1 TB1,024 GB大容量ハードディスク

テキストの2進数表現 — ASCIIとUnicode

コンピュータに「文字」という概念はありません。すべての文字は数値に対応されます。

ASCII — 英字128文字

python
# 文字 → ASCIIコード
print(ord('A')) # 65
print(ord('a')) # 97
print(ord('0')) # 48
print(ord(' ')) # 32
# ASCIIコード → 文字
print(chr(65)) # 'A'
print(chr(97)) # 'a'
print(chr(48)) # '0'
text
'A' = 65 = 01000001 (2進数)
'B' = 66 = 01000010
'a' = 97 = 01100001
'0' = 48 = 00110000

ASCIIは7ビットで128文字を表現します — 英字の大文字小文字、数字、特殊文字。しかし、韓国語、日本語、中国語は表現できません。

Unicode — 世界中の文字

python
print(ord('가')) # 44032
print(ord('한')) # 54620
print(hex(ord('가'))) # '0xac00'
print(chr(44032)) # '가'
print(chr(127829)) # '🍕' (ピザの絵文字)
# UTF-8エンコーディング — バイト数を確認
print('A'.encode('utf-8')) # b'A' — 1 byte
print('가'.encode('utf-8')) # b'\xea\xb0\x80' — 3 bytes
print('🍕'.encode('utf-8')) # b'\xf0\x9f\x8d\x95' — 4 bytes

Unicodeは14万+文字を含みます。UTF-8はUnicodeを保存する方法で、英語は1バイト、韓国語は3バイト、絵文字は4バイトを使用します。


色の2進数表現 — RGB

画面のすべての色は、**赤(R)、緑(G)、青(B)**の3つの値の組み合わせです。各値は0〜255(1バイト)。

python
# RGB値 → 16進数カラーコード
r, g, b = 255, 128, 0
hex_color = f"#{r:02x}{g:02x}{b:02x}"
print(hex_color) # #ff8000 (オレンジ)
# 16進数 → RGB
hex_str = "ff8000"
r = int(hex_str[0:2], 16) # 255
g = int(hex_str[2:4], 16) # 128
b = int(hex_str[4:6], 16) # 0
RGB16進数
25500#ff0000
02550#00ff00
00255#0000ff
255255255#ffffff
000#000000

CSSで#ff8000と書くとき、これはR=255, G=128, B=0を16進数で表現したものです。各チャンネルは8ビット × 3 = 24ビット、約1,677万色の色を表現できます。


負の数の表現方法 — 2の補数

2進数は0と1しかないのに、負の数はどのように表現するのでしょうか?コンピュータは2の補数(Two's Complement) を使用します。

8ビット基準で5-5を見てみましょう。

text
5 = 00000101
-5 = 11111011

2の補数を作る方法:すべてのビットを反転(0→1、1→0)した後、1を足します。

text
5    = 00000101
反転   = 11111010
+1    = 11111011  →  これが-5
python
# Pythonで確認
print(bin(5)) # 0b101
print(bin(-5 & 0xff)) # 0b11111011 (8ビット基準)
# 2の補数の利点:加算回路1つで減算も可能
# 5 + (-5) = 00000101 + 11111011 = 100000000
# 9ビット目は切り捨て → 00000000 = 0 (正確!)

この方式のおかげで、CPUは専用の減算回路なしに、加算回路のみで減算を処理します。

8ビット2の補数で表現できる範囲:-128〜+127(合計256個)。


ビット演算 — 0と1の直接操作

プログラミングでビットを直接操作する演算があります。

python
a = 0b1100 # 12
b = 0b1010 # 10
# AND — どちらも1なら1
print(bin(a & b)) # 0b1000 (8)
# OR — どちらか1なら1
print(bin(a | b)) # 0b1110 (14)
# XOR — 異なれば1
print(bin(a ^ b)) # 0b0110 (6)
# NOT — 反転
print(bin(~a & 0xf)) # 0b0011 (3)
# Shift — ビットを左/右にずらす
print(a << 1) # 24 (12 × 2)
print(a >> 1) # 6 (12 ÷ 2)

左シフト(<<)は×2、右シフト(>>)は÷2の効果があります。乗算/除算よりも高速であるため、パフォーマンスが重要な低レベルコードで使用されます。

実践 — ビットフラグで権限管理

Linuxファイルの権限(chmod 755)はビット演算で動作します。

python
READ = 0b100 # 4
WRITE = 0b010 # 2
EXECUTE = 0b001 # 1
# 権限の設定(ORで結合)
user_perm = READ | WRITE | EXECUTE # 0b111 = 7
group_perm = READ | EXECUTE # 0b101 = 5
other_perm = READ | EXECUTE # 0b101 = 5
print(f"chmod {user_perm}{group_perm}{other_perm}") # chmod 755
# 権限の確認(ANDで検査)
has_write = bool(user_perm & WRITE) # True
has_write_g = bool(group_perm & WRITE) # False

chmod 755の意味:所有者(7=rwx)、グループ(5=r-x)、その他(5=r-x)。各数字は3ビットの10進表現です。


主要なまとめ

概念整理
2進数0と1で全ての数字を表現。コンピュータの基本言語
ビット情報の最小単位(0または1)
バイト8ビット。0〜255の範囲の値
ASCII英字を数値に対応(7ビット、128文字)
Unicode世界中の文字(14万+)。UTF-8で保存
RGB色を3つの値(0〜255)で表現。24ビット = 1,677万色

プログラミングをしながら2進数を直接計算することはあまりありません。しかし、「コンピュータはすべてのものを数値で、その数値を0と1で表現する」という事実を理解すれば、ファイルサイズ、エンコーディングエラー、カラーコード、ビットフラグなどの概念が自然に理解できます。2の補数を理解すれば、整数のオーバーフローがなぜ発生するのか、ビット演算を理解すれば、権限システム(chmod)がなぜ777なのかを説明できます。

💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...