回 1-1 道 1 数と論理と計算量
2 進数は、
読み終えたら8 ビットで
この頁の流れ
数の
なぜ 0 と 1 だけで 数が 表せるのか
0 と
Web の#FF8000 のように0x で
手が
8 個の
2 進数と 16 進数の仕組み
どの
位取りと桁の重み
10 進数の
2 進数では、
| 桁 (左から) | 10 進の重み | 2 進の重み |
|---|---|---|
| 1 | 10000000 | 128 |
| 2 | 1000000 | 64 |
| 3 | 100000 | 32 |
| 4 | 10000 | 16 |
| 5 | 1000 | 8 |
| 6 | 100 | 4 |
| 7 | 10 | 2 |
| 8 | 1 | 1 |
2 進数の
10 進数から 2 進数へ、 2 進数から 10 進数へ
10 進数を
逆に
| 向き | 手順 |
|---|---|
| 10 進から 2 進 | 2 で |
| 2 進から | 1 の |
| 2 進から | 右から |
| 16 進から 2 進 | 16 進の |
16 進数は 4 ビットずつの区切り
16 進数の
| 16 進 | 10 進 | 2 進 (4 ビット) |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| 9 | 9 | 1001 |
| A | 10 | 1010 |
| B | 11 | 1011 |
| C | 12 | 1100 |
| D | 13 | 1101 |
| E | 14 | 1110 |
| F | 15 | 1111 |
動かす 16 進の 1 桁と 4 ビット
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
0 0 0000
1 1 0001
9 9 1001
A 10 1010
B 11 1011
C 12 1100
D 13 1101
E 14 1110
F 15 11111 バイトの0x を付け、0xFF と
16 進数を
動かす 16 進から 10 進へ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
B 11 11
2 2 178
1781 行がint(s, 16) も
8 進数は、0o を
動かす 8 進数は 3 ビットずつ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
10110010
0o262
1781 バイトの
下の
なぜ 16 進数を使うのか
16 進数を
| 使う場面 | 書き方の例 | 16 進数にする理由 |
|---|---|---|
| Web の色 | #RRGGBB | 赤、 |
| メモリの番地 | 0x で | 長い |
| バイト列の表示 | b'\xff' | 1 バイトが |
CSS の色の #RRGGBB は、
動かして確かめる
変換の
動かす 2 で割って 2 進数にする
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
178 ÷ 2 = 89 余り 0
89 ÷ 2 = 44 余り 1
44 ÷ 2 = 22 余り 0
22 ÷ 2 = 11 余り 0
11 ÷ 2 = 5 余り 1
5 ÷ 2 = 2 余り 1
2 ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
0b10110010割り算はbin は、0b を
次は
動かす 重みを足して 10 進数に戻す
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
1 の桁の重み 128
1 の桁の重み 32
1 の桁の重み 16
1 の桁の重み 2
合計 178
178 0xb2
1781 のint(s, 2) はhex は0xb2 を
最後に、色の #FF8000 を
動かす 色を 1 バイトずつ読む
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
FF 255 11111111
80 128 10000000
00 0 00000000赤が
ビットの
動かす n ビットで表せる通り
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
1 ビット 2 通り
4 ビット 16 通り
8 ビット 256 通り
16 ビット 65536 通り
32 ビット 4294967296 通り
8 ビット 0 〜 255
符号付き -128 〜 127
16 ビット -32768 〜 32767n ビットで
符号付き (マイナスも
決まった 幅の 器を 超えると 何が起きるか
値が
Python の int は あふれない
Python の
8 ビットの& 0xFF (下の0xFF は
動かす 8 ビットの器で計算する
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
256
0
4
12676506002282294014967032053761 行目は
器の 幅を 決めると、 止まる 道具もある
値をint.to_bytes と struct が
動かす バイトに詰めるとき止まる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
b'\xff'
OverflowError
int too big to convert
b'\xff'
struct.error
'h' format requires -32768
<= number <= 32767(255).to_bytes(1, "big") はb'\xff' をOverflowError (値がOverflowError を
struct は、"B" は"h" はstruct.error で
同じ 8 ビットでも、 読み方で 値が変わる
同じ
動かす 符号付きとして読む
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
b'\xc8'
200
-56
-128
b'\xff'200 を
ビットの
反対に、
動かす 反転して 1 を足す
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
00111000
11000111
11001000
0xc8
True作った~x は& 0xFF で
| 並び (8 ビット) | 16 進 | 符号なし | 符号付き |
|---|---|---|---|
| 11111111 | FF | 255 | −1 |
| 11001000 | C8 | 200 | −56 |
| 10000000 | 80 | 128 | −128 |
| 01111111 | 7F | 127 | 127 |
崩れる
- 値は
器の 幅に 入る、という 前提。 超えると、 上の 桁が こぼれて 小さな 値に 化けるか、 エラーで止まる - 書いた
側と 読む側が 同じ 読み方を する、という 前提。 符号なしと 符号付きを 取り違えると、 200 が −56 に化ける - 足し算の
結果も 器に 入る、という 前提。 255 も 1 も それぞれは 入るのに、 足すと入らない
仕事で どう 確かめるか
仕事では、
1 つ目は、
2 つ目は、
3 つ目は、int("B2", 16) や hex(178) で
関わる実例
決まった
Ariane 5 の 501 便 (1996 年 6 月 4 日)
欧州の
崩れた
Boeing 787 の 発電機の 制御装置 (2015 年)
米国の
崩れた
よくある問い
16 進数の A〜F は 何を 表すのですか
16 進数では
1 バイトは 何ビットですか
1 バイトは
Python の int は あふれないのですか
Python のint.to_bytes や struct で& 0xFF のように
2 の 補数とは何ですか
2 の
確認クイズ
答えだと
1 問目
8 ビットの
2 問目
2 進数の
3 問目
Python で (255 + 1) & 0xFF を
4 問目
1 バイトの
説明課題
次の
- 8 ビットで
表せる 範囲を、 符号なしと 符号付きの両方で - その
範囲を 超えた ときに 何が 起きるかを、 Python の int との 違いも含めて
自分の
この回の 先の一歩
色の
もっと深く
この
一次資料
どれも
- Built-in Types (Python 公式文書、英語)。整数の
精度に 限りが 無いこと、 int.to_bytesが決めた バイト数で 表せない整数に OverflowErrorを出すこと、 signedで2 の 補数を 使うかを 決めること - Built-in Functions (Python 公式文書、英語)。
binが0b付きの2 進数の 文字列を、 hexが0x付きの小文字の 16 進数の 文字列を、 octが0o付きの8 進数の 文字列を返すこと - struct Interpret bytes as packed binary data (Python 公式文書、英語)。整数の
形に 範囲外の 値を 詰めると struct.errorを出すこと、 'h'の範囲が −32768〜32767 であること - hex-color (MDN Web Docs、英語)。
#RRGGBBの赤、 緑、 青が それぞれ 0 から ff (255) の 16 進数であること - Ariane 5 Flight 501 Failure, Report by the Inquiry Board (ESA、英語)。1996 年 6 月 4 日の
初飛行の 失敗、 64 ビットの 浮動小 数点から 16 ビットの 符号付き整数への 変換で Operand Error が 起きた こと、 Ariane 4 より 水平方向の 速さが 大きかったこと - Airworthiness Directives; The Boeing Company Airplanes, AD 2015-09-07 (米連
邦航 空局、 Federal Register、英語)。電源を 248 日続けて 入れると 数え器が あふれて 停止の 状態に 入る こと、 120 日を 超えない 間隔で 電源を 切り直す整備
次へ
道 1 数と論理と計算量の回
- 1-12 進数と
16 進数桁の 重み、 変換、 表せる範囲この回 - 1-2文字コードと文字化けUnicode、
UTF-8、 Shift_JIS、BOM頁で読む - 1-3計算量を数えるBig-O、
ループの回数頁で読む - 1-4論理と真理値表AND、
OR、 NOT、 ド・モルガン準備中 - 1-5リトルエンディアンと
ビッグエンディアンバイトの 並び順、 ネットワーク、ファイル頁で読む - 1-6Base64 の仕組み64 字の
表、 = の 詰め物、 長さ 4/3頁で読む - 1-7情報量と
ハフマン符号化ビット、 確からしさ、圧縮頁で読む - 1-8チューリングマシンと停止問題テープ、
状態、 計算できない問題頁で読む
