進数(基数)の基本

進数基数使う数字主な用途
2進数(バイナリ)20,1コンピューター内部
8進数(オクタル)80〜7UNIXファイル権限(chmod)
10進数(デシマル)100〜9日常生活
16進数(ヘキサ)160〜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進数
00011
00102
01004
10008
111115
0001 000016
0010 000032
0100 000064
1000 0000128
1111 1111255
1 0000 0000256

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進数
00
99
A10
B11
C12
D13
E14
F15

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進数
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
1010A10
1011B11
1100C12
1101D13
1110E14
1111F15

プログラミング言語での書き方

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

ビット演算の基礎

主要なビット演算子

演算子内容
&AND0b1100 & 0b1010 = 0b1000
|OR0b1100 | 0b1010 = 0b1110
^XOR0b1100 ^ 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’0x416501000001
’a’0x619701100001
’0’0x304800110000
’ ‘(空白)0x203200100000

3. UNIXのchmod(8進数)

chmod 755 script.sh
8進数2進数権限
0000---
1001—x
2010-w-
3011-wx
4100r—
5101r-x
6110rw-
7111rwx

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進数
1270111 1111
10000 0001
00000 0000
-11111 1111
-21111 1110
-1271000 0001
-1281000 0000

-N~N + 1 で計算(ビット反転して+1)。

nビットの範囲

ビット数符号なし範囲符号付き範囲
80〜255-128〜127
160〜65,535-32,768〜32,767
320〜約42億-約21億〜約21億
640〜約1844京-約922京〜約922京

まとめ

  • 16進数1桁 = 2進数4桁、知っておくと変換が瞬時
  • プログラミングでは 0b(2進)0x(16進)プレフィックス
  • ビット演算子(& | ^ << >>)はフラグ管理に必須
  • 色コード・chmod・IPアドレスなど実用例は多い

関連ツール: 進数変換ツール では2進数・8進数・10進数・16進数を一画面で相互変換できます。ビットシフトや論理演算の確認、デバッグ用途にご活用ください。サブネット計算はサブネット計算ツールもあわせてどうぞ。