進数(基数)の基本
| 進数 | 基数 | 使う数字 | 主な用途 |
|---|---|---|---|
| 2進数(バイナリ) | 2 | 0,1 | コンピューター内部 |
| 8進数(オクタル) | 8 | 0〜7 | UNIXファイル権限(chmod) |
| 10進数(デシマル) | 10 | 0〜9 | 日常生活 |
| 16進数(ヘキサ) | 16 | 0〜9, A〜F | 色コード・メモリアドレス |
各進数は桁の重みで値が決まります。
10進数の234 = 2×100 + 3×10 + 4×1
2進数の1101 = 1×8 + 1×4 + 0×2 + 1×1 = 13
16進数の2A = 2×16 + 10×1 = 42
2進数 → 10進数
方法: 各桁の重みを足す
各桁に「2のn乗」を掛けて合計します。
2進数: 1 0 1 1 0 1
桁の重み: 32 16 8 4 2 1
計算: 32 + 0 + 8 + 4 + 0 + 1 = 45
よく使う2進数早見表
| 2進数 | 10進数 |
|---|---|
| 0001 | 1 |
| 0010 | 2 |
| 0100 | 4 |
| 1000 | 8 |
| 1111 | 15 |
| 0001 0000 | 16 |
| 0010 0000 | 32 |
| 0100 0000 | 64 |
| 1000 0000 | 128 |
| 1111 1111 | 255 |
| 1 0000 0000 | 256 |
10進数 → 2進数
方法: 2で割って余りを並べる
45 ÷ 2 = 22 余り 1 ↑
22 ÷ 2 = 11 余り 0 |
11 ÷ 2 = 5 余り 1 |
5 ÷ 2 = 2 余り 1 |
2 ÷ 2 = 1 余り 0 |
1 ÷ 2 = 0 余り 1 |
下から並べる → 101101
引き算法(速い)
「最大の2のべき乗から引く」を繰り返す:
45 - 32 (2^5) = 13 → bit 5 = 1
13 - 8 (2^3) = 5 → bit 3 = 1
5 - 4 (2^2) = 1 → bit 2 = 1
1 - 1 (2^0) = 0 → bit 0 = 1
→ 101101
16進数 → 10進数
方法: 各桁の重みを足す
16進数: 2 A F
桁の重み: 256 16 1
計算: 2×256 + 10×16 + 15×1 = 687
| 16進数 | 10進数 |
|---|---|
| 0 | 0 |
| 9 | 9 |
| A | 10 |
| B | 11 |
| C | 12 |
| D | 13 |
| E | 14 |
| F | 15 |
10進数 → 16進数
方法: 16で割って余りを並べる
687 ÷ 16 = 42 余り 15 (F) ↑
42 ÷ 16 = 2 余り 10 (A) |
2 ÷ 16 = 0 余り 2 (2) |
下から並べる → 2AF
2進数 ⇔ 16進数
16進数1桁 = 2進数4桁で対応するため、相互変換は瞬時にできます。
16進数 → 2進数
各桁を4ビットの2進数に変換するだけ。
16進数: 2 A F
2進数: 0010 1010 1111
→ 1010101111(先頭のゼロは省略可)
2進数 → 16進数
右から4ビットずつ区切って16進1桁に変換。
2進数: 1010 1010 1111
16進数: A A F → AAF
4ビット⇔16進対応表
| 2進数 | 16進数 | 10進数 |
|---|---|---|
| 0000 | 0 | 0 |
| 0001 | 1 | 1 |
| 0010 | 2 | 2 |
| 0011 | 3 | 3 |
| 0100 | 4 | 4 |
| 0101 | 5 | 5 |
| 0110 | 6 | 6 |
| 0111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | A | 10 |
| 1011 | B | 11 |
| 1100 | C | 12 |
| 1101 | D | 13 |
| 1110 | E | 14 |
| 1111 | F | 15 |
プログラミング言語での書き方
JavaScript / TypeScript
// リテラル
const dec = 255;
const bin = 0b11111111; // 2進数: 0bプレフィックス
const oct = 0o377; // 8進数: 0oプレフィックス
const hex = 0xff; // 16進数: 0xプレフィックス
// 変換
parseInt('11111111', 2); // 2進文字列 → 数値: 255
parseInt('FF', 16); // 16進文字列 → 数値: 255
(255).toString(2); // 数値 → 2進文字列: "11111111"
(255).toString(16); // 数値 → 16進文字列: "ff"
// 0埋め
(15).toString(2).padStart(8, '0'); // "00001111"
Python
# リテラル
dec = 255
bin = 0b11111111
oct = 0o377
hex = 0xff
# 変換
int('11111111', 2) # 255
int('FF', 16) # 255
bin(255) # '0b11111111'
hex(255) # '0xff'
oct(255) # '0o377'
# 0埋め書式
f'{255:08b}' # '11111111'
f'{255:02x}' # 'ff'
format(255, '08b') # '11111111'
Go
import "fmt"
import "strconv"
dec := 255
bin := 0b11111111
hex := 0xff
// 変換
n, _ := strconv.ParseInt("11111111", 2, 64) // 文字列 → 数値
s := strconv.FormatInt(255, 2) // 数値 → 文字列
fmt.Printf("%b\n", 255) // 11111111
fmt.Printf("%x\n", 255) // ff
fmt.Printf("%08b\n", 15) // 00001111
Rust
let dec = 255;
let bin = 0b1111_1111; // アンダースコアで区切れる
let hex = 0xff;
println!("{:b}", 255); // "11111111"
println!("{:08b}", 15); // "00001111"
println!("{:x}", 255); // "ff"
let n = i32::from_str_radix("11111111", 2).unwrap(); // 255
ビット演算の基礎
主要なビット演算子
| 演算子 | 内容 | 例 |
|---|---|---|
& | AND | 0b1100 & 0b1010 = 0b1000 |
| | OR | 0b1100 | 0b1010 = 0b1110 |
^ | XOR | 0b1100 ^ 0b1010 = 0b0110 |
~ | NOT(反転) | ~0b1100 = 0b...0011(先頭の1は環境による) |
<< | 左シフト | 0b0001 << 3 = 0b1000 |
>> | 右シフト | 0b1000 >> 3 = 0b0001 |
ビット演算の実用例
フラグ管理
const READ = 0b001; // 1
const WRITE = 0b010; // 2
const EXECUTE = 0b100; // 4
// 複数フラグを設定
let perm = READ | WRITE; // 0b011 = 3
// フラグが立っているか確認
if (perm & READ) { /* 読み取り可 */ }
// フラグを追加
perm |= EXECUTE; // 0b111 = 7
// フラグを削除
perm &= ~READ; // 0b110 = 6
2倍・1/2倍
const a = 12;
a << 1; // 24(2倍)
a >> 1; // 6(1/2倍、整数)
a << 2; // 48(4倍)
進数の実用例
1. RGB色コード(16進数)
color: #FF6F00; /* R=255, G=111, B=0 */
| 16進 | RGB値 | 色 |
|---|---|---|
#FF0000 | (255,0,0) | 赤 |
#00FF00 | (0,255,0) | 緑 |
#0000FF | (0,0,255) | 青 |
#FFFFFF | (255,255,255) | 白 |
#000000 | (0,0,0) | 黒 |
#F97316 | (249,115,22) | ハカドルブランド |
2. ASCIIコード
| 文字 | 16進 | 10進 | 2進 |
|---|---|---|---|
| ’A’ | 0x41 | 65 | 01000001 |
| ’a’ | 0x61 | 97 | 01100001 |
| ’0’ | 0x30 | 48 | 00110000 |
| ’ ‘(空白) | 0x20 | 32 | 00100000 |
3. UNIXのchmod(8進数)
chmod 755 script.sh
| 8進数 | 2進数 | 権限 |
|---|---|---|
| 0 | 000 | --- |
| 1 | 001 | —x |
| 2 | 010 | -w- |
| 3 | 011 | -wx |
| 4 | 100 | r— |
| 5 | 101 | r-x |
| 6 | 110 | rw- |
| 7 | 111 | rwx |
755 = 所有者:rwx(7)、グループ:r-x(5)、その他:r-x(5)
4. IPアドレス(IPv4)
192.168.1.1 を2進数に変換:
192 → 11000000
168 → 10101000
1 → 00000001
1 → 00000001
→ 11000000.10101000.00000001.00000001
5. サブネットマスク
/24 = 11111111.11111111.11111111.00000000 = 255.255.255.0
/16 = 11111111.11111111.00000000.00000000 = 255.255.0.0
/8 = 11111111.00000000.00000000.00000000 = 255.0.0.0
負の数(2の補数)
整数の負の数は2の補数で表現します。
8ビット符号付き整数の例
| 10進数 | 2進数 |
|---|---|
| 127 | 0111 1111 |
| 1 | 0000 0001 |
| 0 | 0000 0000 |
| -1 | 1111 1111 |
| -2 | 1111 1110 |
| -127 | 1000 0001 |
| -128 | 1000 0000 |
-N は ~N + 1 で計算(ビット反転して+1)。
nビットの範囲
| ビット数 | 符号なし範囲 | 符号付き範囲 |
|---|---|---|
| 8 | 0〜255 | -128〜127 |
| 16 | 0〜65,535 | -32,768〜32,767 |
| 32 | 0〜約42億 | -約21億〜約21億 |
| 64 | 0〜約1844京 | -約922京〜約922京 |
まとめ
- 16進数1桁 = 2進数4桁、知っておくと変換が瞬時
- プログラミングでは
0b(2進)0x(16進)プレフィックス - ビット演算子(
& | ^ << >>)はフラグ管理に必須 - 色コード・chmod・IPアドレスなど実用例は多い
関連ツール: 進数変換ツール では2進数・8進数・10進数・16進数を一画面で相互変換できます。ビットシフトや論理演算の確認、デバッグ用途にご活用ください。サブネット計算はサブネット計算ツールもあわせてどうぞ。