基本情報 Part 03 -- 2, 10, 16 進数の相互変換
Tags: 基本情報
Published: 2023-07-02 11:00:16


# 2 進数 <-> 10 進数 ( Binary <-> Decimal )

---

## 2 進数 -> 10 進数

2 ^ (桁数 -1) を桁分繰り返して足す。
つまり 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
1. 2^2 * 0 -> 4 * 0 -> 0
1. 2^1 * 0 -> 2 * 0 -> 0
1. 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

### 別解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

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. 4: 100
2. 8: 1,000
3: 16: 10,000
4: 128: 10,000,000

---

252 の場合

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0eg5cvcnhvxnf2hu93on.png)



---
---

# 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 
    * 128 + 0 + 32 + 16
    * 176
  2. 後半: 2^3*0 + 2^2*1 + 2^1*1 + 2^0*0 
    * 0 + 4 + 2 + 0
    * 6
  3. 合計: 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