DEV Community

kaede
kaede

Posted on • Edited on

基本情報 Part 03 -- 2, 10, 16 進数の相互変換

2 進数 と 10 進数間の相互変換 ( Binary <-> Decimal )


2 進数 から 10 進数 への変換

2 ^ (桁数 -1) を桁分繰り返して足す。

https://xtech.nikkei.com/atcl/learning/lecture/19/00007/00002/#:~:text=%E3%81%BF%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82-,2%E9%80%B2%E6%95%B0%E3%81%8B%E3%82%8910%E9%80%B2%E6%95%B0%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B,-%E3%81%BE%E3%81%9A%E3%80%812%E9%80%B2%E6%95%B0

1001 の場合

  1. 2^3 * 1 -> 8 * 1 -> 8
  2. 2^2 * 0 -> 4 * 0 -> 0
  3. 2^1 * 0 -> 2 * 0 -> 0
  4. 2^0 * 1 -> 1 * 1 -> 1

これで合計 9


10 進数 から 2 進数 への変換

https://www.infraexpert.com/study/ip1.html#:~:text=%E6%95%B0%E5%80%A4%E3%82%92%E3%80%8C%200%20%E3%80%8D-,%E3%81%AB,-%E3%81%AA%E3%82%8B%E3%81%BE%E3%81%A7%E3%80%8C%202

2 で割って商と余りを出す。
余りをその桁の bit として、商を再度割り続ける

9 の場合

  1. 9/2 -> 4 + 1
  2. 4/2 -> 2 + 0
  3. 2/2 -> 1 + 0
  4. 1/2 -> 0 + 1

逆から並べて 1001

252 の場合(紙を使う場合)

Image description

別解1

9 -> 8 + 1 -> 2^3 + 2^2*0 + 2^1*0 + 2^0
-> 1001

  1. 160
  2. 128 + 32
  3. 2^7 + 2^6*0 + 2^5 + 2^4*0 + ...
  4. 1010,0000

というように、2 の累乗の数の足し算に分解する。
2^n 乗で割やすい数だと、このやり方の方が速い。

別解2 ( 4, 8, 16, 128, 256 ) などの場合

https://www.infraexpert.com/study/ip1.html#:~:text=%E3%81%AE%E5%A4%89%E6%8F%9B%E6%96%B9%E6%B3%95-,10%E9%80%B2%E6%95%B0%E3%81%A82%E9%80%B2%E6%95%B0%E3%81%AE%E5%AF%BE%E5%BF%9C%E8%A1%A8,-%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E9%80%9A%E3%82%8A

10 進数と 2 進数で桁が上がるところを覚える
キリがいい数なら、一撃で出せる

  1. 2: 10
  2. 4: 100
  3. 8: 1,000
  4. 16: 10,000
  5. 128: 1000_0000 (2^7, 8bit)
  6. 256: 1_0000_0000 (2^8, 9bit)
  7. 1024: 2^10

※ 255: 1111_1111 (2^8 - 2^0, 8bit)
(計算には 8 ビットが良くつかわれる



2 進数 <-> 16 進数 ( Binary <-> Hexdecimal )


2 進数 -> 16 進数

4 桁ずつに分割して、各自 10 進数に変換する。
その後、16 進数に変換する。

https://www.infraexpert.com/study/ip2.html#:~:text=10-,%E2%97%86%E3%80%802%E9%80%B2%E6%95%B0%E3%81%8B%E3%82%8916%E9%80%B2%E6%95%B0%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E6%96%B9%E6%B3%95,-2%E9%80%B2%E6%95%B0%E3%81%AE

1011,0110 の場合

  1. 1011 を 10 進数に変換する。
    • 2^3 + 2^2*0 + 2^1 + 2^1
    • 8 + 0 + 2 + 1 -> 11
  2. 11 を 16 進数に変換する。
    • 16 進数では 16 まで 0 ~ F の一桁で表現する
    • だから 9 -> A -> B になる。
    • よって 11 は B
  3. 0110 を 10 進数に変換する。
    • 8*0 + 4 + 2 + 0 -> 6
  4. 6 を 16 進数に変換する
    • 9 未満なのでそのまま 6
  5. 2 と 4 をくっつける
    • B6

16 進数 -> 2 進数

https://www.infraexpert.com/study/ip2.html#:~:text=%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,%E2%97%86%E3%80%8016%E9%80%B2%E6%95%B0%E3%81%8B%E3%82%892%E9%80%B2%E6%95%B0%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E6%96%B9%E6%B3%95,-16%E9%80%B2%E6%95%B0%E3%81%AE

1 桁ずつ 10 進数 -> 2 進数に変換する。
9 の次が a になるだけなので、1 桁なら 10 進数 -> 2進数の変換は楽

B6 の場合

  1. 16 進数で B
    1. 10 進数で 11
    2. 2 進数にする
    3. 8 + 2 + 1
    4. 2^3 * 1 + 2^2 * 0 + 2^1 * 1 + 2^0 * 1
    5. 1011
  2. 16 進数で 6
    1. 10 進数でも 6
    2. 2 進数にする
    3. 4 + 2
    4. 2^3 * 0 + 2^2 + 2^1 + 2^0 * 0
    5. 0110
  3. 合算する
    1. 10110110


10 進数 <-> 16 進数

  • いったん 2 進数を挟む。

16 進数 -> 10 進数

https://www.infraexpert.com/study/ip2.html

B6 の場合

  1. 2 進数で 1011,0110
  2. 10 進数で
    1. 前半: 2^7 + 0 + 2^5 + 2^4
    2. 128 + 0 + 32 + 16
    3. 176
    4. 後半: 2^3*0 + 2^2*1 + 2^1*1 + 2^0*0
    5. 0 + 4 + 2 + 0
    6. 6
    7. 合計: 182
  3. 結論、182

10 進数 -> 16 進数

182 の場合

2 進数にする

  1. 128 + 54
  2. 128 + 0 + 32 + 16 + 0 + 4 + 2 + 0
  3. 1011,0110

1011,0110 になる

前半、後半と別々の 10 進数にする

8 + 0 + 2 + 1
-> 11

0 + 4 + 2 + 0
-> 6

それぞれ 16 進数にして桁をずらして足す

結論、B6

Top comments (0)