Open6
[Ruby]進数

Rubyの進数表現
- 10進数(Decimal): 通常の10進数です。
42
-
16進数(Hexadecimal): 16進数は
0x
または0X
で始まり、0から9までの数字とAからFまでのアルファベットを使って表現されます。
0 1 2 3 4 5 6 7 8 9 A B C D E F
10 11 12 13 14 15
-
8進数(Octal): 8進数は先頭に
0
をつけて表現されます。
0 1 2 3 4 5 6 7
-
2進数(Binary): 2進数は先頭に
0b
または0B
をつけて表現されます。例えば、0b101010
は2進数です。
0 1

n進数 <=> 10進数
String#to_i
メソッドを使います。
# 16進数
irb(main):001:0> 0x2A.to_i
=> 42
# 16^1 * 2 + 16^0 * 10 = 32 + 10 = 42
# 8進数
irb(main):002:0> 052.to_i
=> 42
# 8^2 * 0 + 8^1 * 5 + 8^0 * 2 = 0 + 40 + 2 = 42
# 2進数
irb(main):003:0> 0b101010.to_i
=> 42
# 2^5 * 1 + 2^4 * 0 + 2^3 * 1 + 2^2 * 0 + 2^1 * 1 + 2^0 * 0 = 32 + 0 + 8 + 0 +2 = 42

10進数 <=> n進数
Integer#to_s
メソッドを使用します。
to_s
メソッドの引数に基数を指定することで、異なる進数への変換が可能です。
10進数 <=> 8進数
- 8進数は0から7までの数字を使う
- 10進数の数値を8で割り続けて、割り算の余りを記録する
- 余りを逆順に読み取って8進数の表現になる
irb(main):100:0> 10.to_s(8)
=> "12"
# 10/8 = 1 余り2
# 1/8 = 0 余り 1
# 12
10進数 <=> 16進数
- 16進数は0から9までの数字とAからFまでのアルファベットを使う。
- 10進数の数値を16で割り続けて、割り算の余りを記録する。
- 余りが10以上の場合、対応するアルファベットに変換する。
- 余りを逆順に読み取って16進数の表現になる
irb(main):101:0> 10.to_s(16)
=> "a"
# 10/16 = 0余り10
# 10は16進数ではaに対応
10進数 <=> 2進数
- 2進数は0と1の数字のみを使う
- 10進数の数値を2で割り続けて、割り算の余りを記録する
- 余りを逆順に読み取って2進数の表現になる
irb(main):102:0> 10.to_s(2)
=> "1010"
# 10/2=5余り0
# 5/2=2余り1
# 2/2=1余り0
# 1/2=0余り1
# 1010

8進数 <=> n進数
8進数 <=> 2進数
8進数から2進数への変換は、中間の10進数表現を介して行うのが一般的です。
8進数の025を2進数に変換:
irb(main):105:0> 025.to_i
=> 21
# 8^1 * 2 + 8^0 * 5 = 16 + 5 = 21
irb(main):106:0> 21.to_s(2)
=> "10101"
# 21/2 = 10余り1
# 10/2 = 5余り0
# 5/2 = 2余り1
# 2/2 = 1余り0
# 1/2 = 0余り1
# 10101
8進数 <=> 16進数
8進数から2進数への変換も、中間の10進数表現を介して行います。
8進数の025を16進数に変換:
irb(main):105:0> 025.to_i
=> 21
# 8^1 * 2 + 8^0 * 5 = 16 + 5 = 21
irb(main):107:0> 21.to_s(16)
=> "15"
# 21/16 = 1余り5
# 1/16 = 0余り1
# 15

2進数<=>16進数
2進数から16進数に変換するには、まず2進数を4ビットずつ区切り、それぞれの4ビットを16進数の対応する桁に変換します。
- 2進数を4ビットずつ区切ります。最初の4ビットがない場合、左に0を追加します。
- 各4ビットのグループを16進数に変換します。
- 各4ビットのグループを16進数に変換して、それらを連結します。
2進数: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
16進数: 0 1 2 3 4 5 6 7 8 9 A B C D E F
2進数 0b101010
を16進数に変換:
- 4ビットずつ区切り:
0010 1010
- 各4ビットのグループを16進数に変換:
2 a
- 連結して16進数表現を得る:
2a
irb(main):002:0> 0b101010.to_s(16)
=> "2a"

10進数 | 2進数 | 8進数 | 16進数 |
---|---|---|---|
0 | 0b0 | 00 | 0x0 |
1 | 0b1 | 01 | 0x1 |
2 | 0b10 | 02 | 0x2 |
3 | 0b11 | 03 | 0x3 |
4 | 0b100 | 04 | 0x4 |
5 | 0b101 | 05 | 0x5 |
6 | 0b110 | 06 | 0x6 |
7 | 0b111 | 07 | 0x7 |
8 | 0b1000 | 010 | 0x8 |
9 | 0b1001 | 011 | 0x9 |
10 | 0b1010 | 012 | 0xA |
11 | 0b1011 | 013 | 0xB |
12 | 0b1100 | 014 | 0xC |
13 | 0b1101 | 015 | 0xD |
14 | 0b1110 | 016 | 0xE |
15 | 0b1111 | 017 | 0xF |