2進数から16進数へ:4ビットで1桁、計算は不要
この変換でわかること
ビット列を4桁ずつのまとまりに区切り直し、それぞれを基数16の1桁として書きます。16項目の対応表以上の計算は不要なので、目で追うだけで済ませられる唯一の変換です。長すぎて目視では追えないビット列を読むときの標準的な手段でもあります。
4桁ずつがぴったり収まる理由
16は2の4乗なので、2進数の4桁と基数16の1桁は必ず1対1で対応し、端数も半端な組も出ません。8ビットは4桁の組2つに分かれますが、3では8を割り切れないため、バイト単位のデータでは16進数が選ばれます。先頭の短い組は0で埋めれば、値を変えずに桁をそろえられます。
2進数と16進数の変換表
4ビットで作れる16通りの組み合わせと、それに対応する16進数の1桁です。この表を覚えてしまえば、あとは計算ではなく書き写しの作業になります。
| 2進数 | 16進数 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 10 | 2 |
| 11 | 3 |
| 1010 | A |
| 1111 | F |
| 10000 | 10 |
| 101010 | 2A |
| 11111111 | FF |
| 100000000 | 100 |
デバッグ中に何度もやる変換
プロトコルのフィールドやレジスタ、ビットマスクが2進数で届き、ドキュメントには16進数で書かれているとき、その間をつなぐのがこの変換です。4桁ずつ進めるやり方は確認にもなります。ビットの総数が4の倍数でなければ、どこかで1ビット落ちていると気づけるからです。
先頭の組は推測せず0で埋める
6ビットの文字列は1桁と半分になり、そのままでは桁として成立しません。左端の組を0で埋めて4桁にしてから変換します。101011なら0010 1011とします。位置を勘で合わせると、値が16倍ずれたまま気づかないという事故になります。
よくある質問
2進数から16進数へ手で変換する手順は?
右端から4桁ずつに区切り、左端の組が短ければ0で埋めてから、各組を対応する16進数の1桁に置き換えます。10011100は1001 1100となり、9Cになります。
なぜ左からではなく右から区切るのですか?
右端が最も小さい位の値を担っており、位の値に沿って区切らなければ意味が変わってしまうからです。左から区切ると、桁数が4の倍数でないときにすべての桁がずれ、位置がずれるだけでなく値そのものが静かに変わってしまいます。
1バイトは16進数で何桁になりますか?
ちょうど2桁です。1バイトは8ビットで、4ビットが1桁に対応するからです。この関係が固定されているおかげで、メモリダンプは2桁ずつの組として読み進められます。
長いビット列も変換できますか?
変換できます。64ビットの値は16桁の16進数になり、近似ではなく正確な結果が返ります。全体を通して整数のまま計算するため、浮動小数点なら丸めが始まるような大きな値でも桁が欠けません。
空白入りのビット列をそのまま貼り付けられますか?
はい。空白やアンダースコアは変換前に取り除かれるので、端末やデータシート、差分からコピーしたビット列も整える必要はありません。元の区切り方は値に影響しません。