python初学者の備忘録　n進数変換について

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# 10進数、2進数、8進数、16進数

`基本`

##### それぞれの表記

| 10進数 | 2進数 | 8進数 | 16進数 |
|:-:|--:|--:|--:|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 10 | 2 | 2 |
| 3 | 11 | 3 | 3 |
| 4 | 100 | 4 | 4 |
| 5 | 101 | 5 | 5 |
| 6 | 110 | 6 | 6 |
| 7 | 111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |

## 2進数，8進数, 16進数を10進数に変換

:::note info
出力結果は数値型になる
:::

```python
# -- 2進数の前にはプレフィックス0bを付ける --
>>> 0b11111111
255

# -- 8進数の前にはプレフィックス0oを付ける --
>>> 0o377
255

# -- 16進数の前にはプレフィックス`0x`を付ける --
>>> 0xff
255
```

:::note info
Python3.6からはプレフィックスの後ならどこにでも_を挿入できる
:::

```python
# -- 2進数 --
>>> 0b_1_1_1_1_1111
255

# -- 8進数 --
>>> 0o37_7
255

# -- 16進数 --
>>> 0x_f_f
255
```

:::note alert
ただし2連続以上はエラーになる
:::

```python
>>> 0b1__1111111
# SyntaxError: invalid binary literal
```

##### 文字列で出力するには`str()関数`をつかう
```python
>>> str(0b11111111)
>>> str(0o377)
>>> str(0xff)

# -- 出力結果 --
'255' # 文字列型になる
```

## 2進数への変換
##### ` bin() `関数：2進数の文字列に変換する

```python
>>> bin(1)     
'0b1'
>>> bin(2) 
'0b10'
>>> bin(3) 
'0b11'
>>> bin(4) 
'0b100'
>>> bin(5) 
'0b101'
```

##### ` format() `関数： 書式化指定文字に`b`を指定することで2進数の文字列に変換する

```python
>>> format(5, 'b') 
'101'

# プレフィックスが必要な場合"#"を付ける
>>> format(5, '#b') 
'0b101'

# 任意の桁数で0埋めすることもできる。
>>> format(5, '08b') 
'00000101'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> format(5, '#010b') 
'0b00000101'
```

##### ` format() `メソッド： 書式化指定文字に`b`を指定することで2進数の文字列に変換する

```python
>>> '{:#b}'.format(5) 
'101'

# プレフィックスが必要な場合"#"を付ける
>>> '{:#b}'.format(5) 
'0b101'

# 任意の桁数で0埋めすることもできる。
>>> '{:08b}'.format(5) 
'00000101'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> '{:#010b}'.format(5)   
'0b00000101'
```

##### `f文字列 `：書式化指定文字に`b`を指定することで2進数の文字列に変換する

```python
>>> f'{5:b}'
'101'

# プレフィックスが必要な場合"#"を付ける
>>>  f'{5:#b}'
'0b101'

# 任意の桁数で0埋めすることもできる。
>>> f'{5:08b}'
'00000101'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> f'{5:#010b}'
'0b00000101'
```

## 8進数への変換
##### ` oct() `関数：8進数の文字列に変換する

```python
>>> oct(5)   
'0o5'
>>> oct(6)  
'0o6'
>>> oct(7)  
'0o7'
>>> oct(8)  
'0o10'
>>> oct(9)  
'0o11'
>>> oct(10)  
'0o12'
```

##### ` format() `関数： 書式化指定文字に`o`を指定することで8進数の文字列に変換する

```python
>>> format(10, 'o')
'12'

# プレフィックスが必要な場合"#"を付ける
>>> format(10, '#o')
'0o12'

# 任意の桁数で0埋めすることもできる。
>>> format(10, '08o')
'00000012'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> format(10, '#010o')
'0o00000012'
```

##### ` format() `メソッド： 書式化指定文字に`o`を指定することで8進数の文字列に変換する

```python
>>> '{:o}'.format(10)
'12'

# プレフィックスが必要な場合"#"を付ける
>>> '{:#o}'.format(10) 
'0o12'

# 任意の桁数で0埋めすることもできる。
>>> '{:08o}'.format(10)
'00000012'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> '{:#010o}'.format(10)
'0o00000012'
```

##### ` f文字列 `：書式化指定文字に`o`を指定することで8進数の文字列に変換する

```python
>>> f'{10:o}'
'12'

# プレフィックスが必要な場合"#"を付ける
>>>  f'{10:#o}'
'0o12'

# 任意の桁数で0埋めすることもできる。
>>> f'{10:08o}'
'00000012'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> f'{10:#010o}'
'0o00000012'
```

## 16進数への変換
##### ` hex() `関数：16進数の文字列に変換する

```python
>>> hex(11) 
'0xb'
>>> hex(12) 
'0xc'
>>> hex(13) 
'0xd'
>>> hex(14) 
'0xe'
>>> hex(15) 
'0xf'
>>> hex(16) 
'0x10'
>>> hex(17) 
'0x11'
```

##### ` format() `関数： 書式化指定文字に`x`を指定することで16進数の文字列に変換する

```python
>>> format(17, 'x')
'11'

# プレフィックスが必要な場合"#"を付ける
>>> format(17, '#x')
'0x11'

# 任意の桁数で0埋めすることもできる。
>>> format(17, '08x')
'00000011'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> format(17, '#010x')
'0x00000011'
```

##### ` format() `メソッド： 書式化指定文字に`x`を指定することで16進数の文字列に変換する

```python
>>> '{:#x}'.format(17)
'0x11'

# プレフィックスが必要な場合"#"を付ける
>>> '{:#x}'.format(17)
'0x11'

# 任意の桁数で0埋めすることもできる。
>>> '{:08x}'.format(17)
'00000011'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> '{:#010x}'.format(17)
'0x00000011'
```

##### ` f文字列 `：書式化指定文字に`x`を指定することで16進数の文字列に変換する

```python
>>> f'{17:x}'
'11'

# プレフィックスが必要な場合"#"を付ける
>>> f'{17:#x}'
'0x11'

# 任意の桁数で0埋めすることもできる。
>>> f'{17:08x}'
'00000011'

# プレフィックスをつけたい場合その分の文字数も考慮する
>>> f'{17:#010x}'
'0x00000011'
```