3秒でわかる
0 か 1 のどちらかを表す情報の最小単位。8 個で 1 バイトになり、扱える数の範囲やファイルの大きさは、すべてこの個数から決まります。
もう少し詳しく
どういうものか
ビットは、0 と 1 の 2 つの状態だけを表せる情報の最小単位です。電圧の高低や磁気の向きといった物理的な 2 状態に対応させられるため、計算機の内部表現はすべてこれを並べたものになっています。
n ビットで表せる組み合わせは 2 の n 乗通りです。8 ビット (1 バイト) なら 256 通りで、符号無しなら 0 から 255、符号ありなら -128 から 127 を表します。int が 32 ビットの言語で扱える上限がおよそ 21 億なのは、2 の 31 乗が約 21 億だからです。
なぜ必要か
型の上限、色の表現、通信速度の単位まで、実務で出てくる数値の多くがビット数から逆算できます。RGB 各 8 ビットで約 1677 万色になる理由も、IPv4 が 32 ビットゆえに枯渇した理由も、同じ計算です。桁数の意味が分かっていると、桁あふれの事故を設計の段階で防げます。
権限の管理のように、状態を 1 つずつ持たせたい場面でも直接使います。読み取り、書き込み、実行をそれぞれ 1 ビットに割り当てれば、3 つの可否を 1 つの整数で表せます。
具体例
flags = 0b0000 # 読み=1, 書き=2, 実行=4
flags |= 0b0001 # 読みを立てる -> 0b0001
flags |= 0b0100 # 実行を立てる -> 0b0101
print(bin(flags)) # 0b101
print(flags & 0b0100 != 0) # True 実行が立っているか
flags &= ~0b0100 # 実行を下ろす
print(bin(flags)) # 0b1
print(1 << 10) # 1024 左シフトは 2 倍を繰り返す
print(255 >> 4) # 15Linux のファイル権限 chmod 755 も、3 ビットずつを 8 進数で書いた表記です。
つまずきやすいところ
ビットとバイトの取り違えは実務でもよく起きます。通信速度は 100 Mbps のように小文字の b でビット毎秒を表し、ファイルサイズは MB とバイトで表します。100 Mbps の回線で 100 MB のファイルを送ると、理論値でも 8 秒かかります。
もう 1 つは符号ビットの見落としです。最上位ビットは符号の表現に使われるため、32 ビットの int に 30 億を入れると負の値になります。Java の int で Integer.MAX_VALUE + 1 が最小値になるのはこのためです。
似た用語との違い
| 単位 | 大きさ |
|---|---|
| 1 ビット | 0 か 1 |
| 1 バイト | 8 ビット |
| 1 KB | 1024 バイト (通信では 1000 とすることもある) |
覚え方
電球 1 個の点灯と消灯が 1 ビットです。電球を 8 個並べれば 256 通りの模様が作れます。