Open6

[Ruby]進数

rdhdrdhd

Rubyの進数表現

  1. 10進数(Decimal): 通常の10進数です。
42
  1. 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
  1. 8進数(Octal): 8進数は先頭に0をつけて表現されます。
0 1 2 3 4 5 6 7
  1. 2進数(Binary): 2進数は先頭に0bまたは0Bをつけて表現されます。例えば、0b101010 は2進数です。
0 1
rdhdrdhd

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

https://docs.ruby-lang.org/ja/latest/method/String/i/to_i.html

rdhdrdhd

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

https://docs.ruby-lang.org/ja/latest/method/String/i/to_s.html

rdhdrdhd

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
rdhdrdhd

2進数<=>16進数

2進数から16進数に変換するには、まず2進数を4ビットずつ区切り、それぞれの4ビットを16進数の対応する桁に変換します。

  1. 2進数を4ビットずつ区切ります。最初の4ビットがない場合、左に0を追加します。
  2. 各4ビットのグループを16進数に変換します。
  3. 各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進数に変換:

  1. 4ビットずつ区切り: 0010 1010
  2. 各4ビットのグループを16進数に変換: 2 a
  3. 連結して16進数表現を得る: 2a
irb(main):002:0> 0b101010.to_s(16)
=> "2a"
rdhdrdhd
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