進数変換とビット演算 - 「なぜ16進数なのか」を実務目線で理解する
執筆: デジタル道具屋 編集部 / 低レイヤー担当
ファームウェア開発、組込み、画像処理など、ビット単位での扱いが日常になる領域での経験を持つ編集チームです。
本記事の執筆方針と編集ポリシーについてはAbout ページをご覧ください。
導入:「16進数を読まないといけない場面」は意外に多い

0xDEADBEEF っていう値を見つけたんだぜ。これって何かのジョークかよ?」

#FF0000 も 16進数だし、Unicode の文字コードも 16進数。Web 開発でも『読めると便利』を超えて『読めないと詰む』場面が結構あるわ。」1. なぜ「16進数」なのか

11111111 と FF、どちらが速く認識できるかね?」- 4ビット = 1桁:1バイト(8ビット)が 2桁できれいに表現できる
- 視認性:32 ビット値が 8桁、64 ビット値が 16桁。一目でビット幅がわかる
- 歴史的経緯:CPU レジスタの幅、メモリアドレス、文字コード表など、低レイヤの世界では事実上の標準
ちなみに 8進数(octal)は、Unix のファイルパーミッション 0755 や chmod 644 で今も現役です。 3ビット = 1桁の対応で、rwx の3ビットを表現するのに都合が良かったため残っています。
2. ビット演算で書ける「権限フラグ」

can_read, can_write, can_delete って列を作るんじゃないのかよ?」
const READ = 0b0001; // 1
const WRITE = 0b0010; // 2
const DELETE = 0b0100; // 4
const ADMIN = 0b1000; // 8
// 「読み書き可能、削除不可、管理者でない」
const perm = READ | WRITE; // → 3 (0b0011)
// 権限チェック
const canDelete = (perm & DELETE) !== 0; // → false
const canWrite = (perm & WRITE) !== 0; // → true
// 削除権限を付与
const newPerm = perm | DELETE; // → 7 (0b0111)
// 削除権限を剥奪
const restored = newPerm & ~DELETE; // → 3
注意:JavaScript のビット演算は 32bit まで
JavaScript のビット演算子は符号付き 32bit 整数に変換して動作します。 32 ビット目(最上位)に立ったビットは負数として扱われ、思わぬ結果になります。 Bigger なフラグセットを扱う場合は BigInt を使うか、複数の整数に分割しましょう。
3. 文字コードを読み解く
絵文字や漢字が文字化けして「?」になったとき、原因究明には Unicode コードポイントを 16進数で読む力が要ります。
'あ'.codePointAt(0).toString(16)
// → "3042" (Unicode U+3042)
'😀'.codePointAt(0).toString(16)
// → "1f600" (Unicode U+1F600)
// UTF-8 では何バイト?
new TextEncoder().encode('あ').length // → 3
new TextEncoder().encode('😀').length // → 4
4. 進数変換が日常で必要になるシーン
- カラーコード:HEX
#FF6347を RGB(255, 99, 71)に - 権限・ステータスフラグ:DB に保存された整数からビットを読み取る
- ネットワーク:IPv4 サブネットマスク、IPv6 アドレス
- セキュリティ:ハッシュ値、JWT のヘッダ・ペイロードを Base64URL でデコード
- 組込み・低レイヤ:レジスタ値の読解、メモリダンプ
5. 実際に変換してみる
即座に進数を変換するなら、進数変換ツールが便利です。 2進・10進・16進・8進の相互変換に加え、入力した数のビットパターンも視覚的に確認できます。
関連: カラーコード変換(HEX↔RGB)、ハッシュ生成(生成結果は通常 16進数文字列)。
🚨 現場の失敗あるある
JavaScript で parseInt('08') がブラウザによって 0 を返した時代がありました。 第2引数(基数)を必ず明示する parseInt('08', 10) の習慣を付けると、 旧仕様への後方互換が原因のバグを未然に防げます。
参考にした一次情報
本記事の内容は、以下の公式仕様や一次情報を参照して執筆しています。
- ECMAScript Bitwise Operators
ECMA TC39
https://tc39.es/ecma262/#sec-bitwise-not-operator
- parseInt() - JavaScript | MDN
MDN Web Docs
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt
- The Unicode Standard, Code Charts
The Unicode Consortium
https://www.unicode.org/charts/