- 技術 💻
16進数とは|変換の手順を図解・5言語で実行・早見表0〜255
結論
16進数は、0〜9とA〜F(10〜15)の16種類の記号を使い、16になると桁が1つ上がる数の書き方です。16進数の1桁は2進数の4桁(4ビット)とぴったり対応するため、2桁で1バイト(0〜255)を短く書けます。
この記事でわかること
- 10進数・2進数との変換手順を図と表で一歩ずつ
- Python・JavaScript・Java・C・bashで変換した実行結果とエラー原文
- カラーコード・UTF-8・MACアドレスの実物と、0〜255の早見表
16進数・2進数・10進数は、同じ数を別の書き方で表したものです。変換の道筋は次の3本だけ覚えれば迷いません。
flowchart TD
B["2進数<br>1101 0110"] -->|"4桁ずつ区切って<br>1桁に置き換える"| H["16進数<br>D6"]
H -->|"位の重み(16のべき乗)を<br>掛けて足す"| D["10進数<br>214"]
D -->|"16で割り、余りを<br>下から読む"| H2["16進数<br>D6"]
H2 -->|"1桁を4桁の2進数に戻す"| B2["2進数<br>1101 0110"]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| 16進数とは | 16で桁が上がる数。10〜15をA〜Fで書く | 16進数とは |
| 16進数 10進数 変換 | 各桁に16のべき乗を掛けて足す。FF=15×16+15=255 | 16進数を10進数に変換する方法 |
| 10進数 16進数 変換 | 16で割り続け、余りを下から読む。1000=3E8 | 10進数を16進数に変換する方法 |
| 2進数 16進数 変換 | 右から4桁ずつ区切り、1桁ずつ置き換える | 2進数と16進数の変換 |
| 0xFF・#ff8800 の意味 | 0x と # は「16進数です」という印。値は255と(255, 136, 0) | 16進数の書き方 |
| 16進数の負の数 | 2の補数で表す。8ビットの FF は符号ありなら−1 | 16進数の計算と負の数 |
| なぜ16進数を使うのか | 2進数を4分の1の長さで、区切りを崩さずに書けるから | 対応表と使う理由 |
| 16進数 早見表 | 0〜255を10進・16進・2進・8進・文字で一覧 | 変換早見表(0〜255) |
確認環境:Ubuntu 24.04.5 LTS の上で、変換の計算と例はすべて Python 3.13.18 で実行して値を確かめました。同じ変換を Node.js 22.23.4(JavaScript)、OpenJDK 21.0.12.1(Java)、gcc 13.3.0(C 言語)、GNU bash 5.2.21 の printf・算術式、bc 1.07.1、GNU coreutils 9.4 の od、xxd(apt の xxd 9.1.0016)でも動かし、出力とエラーの原文を載せています。カラーコードは Chromium 153.0.8010.12(Playwright 1.63.0 から起動)で getComputedStyle の値を読み、MAC アドレスは ip netns の中に作った仮想インターフェースで確かめました。0〜255の早見表は Python・bash・Node.js の3通りで生成し、3つのファイルが一致すること(md5 が同じ)を確かめてから載せています。Excel の HEX2DEC は Microsoft の公式ドキュメントの範囲で書き、例の値は Python で計算し直しました。図は mermaid-cli 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「16進数とは|変換の手順を図解・5言語で実行・早見表0〜255」
16進数とは(16進法の意味と数え方)
この節では、16進数(16進法)がどんな数え方なのかと、A〜F が出てくる理由が分かります。
16進数(hexadecimal、略して hex)は、1つの桁に16種類の記号を使い、16集まると次の桁に繰り上がる数の書き方です。ふだん使う10進数は0〜9の10種類で、10になると繰り上がります。16進数は「10〜15を1桁で書く記号」が足りないため、アルファベットの A〜F を借ります。
- 16進法:16で繰り上がる「数え方(記数法)」の名前。
- 16進数:16進法で書いた「数」そのもの。「FF は16進数で255」のように使います。
実際の使い分けはゆるく、どちらも同じ意味で使われることが多い言葉です。英語では hex と呼ばれ、プログラムの中では 0xFF、CSS では #FF8800 のように、先頭に印を付けて10進数と区別します。
0から32まで数えてみる
10進数で数えるのと同じように、いちばん右の桁を1ずつ増やし、F の次で繰り上がります。
| 10進数 | 16進数 | 10進数 | 16進数 |
|---|---|---|---|
| 0〜9 | 0〜9(同じ) | 16 | 10(ここで繰り上がる) |
| 10 | A | 17 | 11 |
| 11 | B | 25 | 19 |
| 12 | C | 26 | 1A |
| 13 | D | 31 | 1F |
| 14 | E | 32 | 20 |
| 15 | F | 255 | FF(2桁の最大) |
「10」の読み方に注意
見分ける問い:「この10は、何で繰り上がった10か」
位の重みは16のべき乗
10進数の 345 が「3×100+4×10+5×1」であるのと同じく、16進数の各桁には「16のべき乗」の重みがあります。右から 1、16、256、4096、65536 … です。
| 桁(右から) | 重み | 10進数での値 |
|---|---|---|
| 1桁目 | 160 | 1 |
| 2桁目 | 161 | 16 |
| 3桁目 | 162 | 256 |
| 4桁目 | 163 | 4,096 |
| 5桁目 | 164 | 65,536 |
2022年4月1日には、A〜F の代わりに別の文字を使う「Bioctal」という表記を提案する RFC 9226 も公開されました。4月1日の公開で、実際に広く使われている書き方ではありません。A〜F(小文字の a〜f も同じ意味)が標準です。
2進数・10進数・16進数の対応表と、16進数を使う理由
この節では、0〜15の対応と、コンピューターの世界で16進数がよく使われる理由が分かります。
16進数の1桁は、2進数のちょうど4桁(4ビット、1ニブル)に当たります。16=24 だからです。この対応を覚えておくと、変換のほとんどが表を引くだけで終わります。
| 10進数 | 2進数(4桁) | 16進数 | 8進数 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 8 | 10 |
| 9 | 1001 | 9 | 11 |
| 10 | 1010 | A | 12 |
| 11 | 1011 | B | 13 |
| 12 | 1100 | C | 14 |
| 13 | 1101 | D | 15 |
| 14 | 1110 | E | 16 |
| 15 | 1111 | F | 17 |
同じ数を書くのに必要な桁数(実測)
Python で、各ビット数の最大値を2進数・10進数・16進数で書いたときの桁数を数えました。
| ビット数 | 2進数の桁数 | 10進数の桁数 | 16進数の桁数 | 16進数での最大値 |
|---|---|---|---|---|
| 8 | 8 | 3 | 2 | FF |
| 16 | 16 | 5 | 4 | FFFF |
| 32 | 32 | 10 | 8 | FFFFFFFF |
| 64 | 64 | 20 | 16 | FFFFFFFFFFFFFFFF |
1短い
2進数の4分の1の長さで書ける。11111111 より FF のほうが読み間違えにくい。
2区切りが崩れない
1バイトが必ず2桁になる。10進数では 9 は1桁、200 は3桁で、バイトの境目が見えない。
3ビットが読める
1桁を見れば4ビットの並びが分かる。D なら 1101。10進数の 214 からはすぐに分からない。
8進数は2進数の3桁ずつに対応し、Linux のファイルの権限(chmod 644)などで使われます。バイト(8ビット)を割り切れるのは4ビット単位の16進数のほうなので、メモリやデータの中身を書くときは16進数が主に使われます。
16進数を10進数に変換する方法(位の重みを掛けて足す)
この節では、16進数を10進数に直す手順が、例題4つと計算の途中式で分かります。
各桁の値(A〜F は10〜15)に、その桁の重み(16のべき乗)を掛けて、全部足します。
桁に番号を振る
右端を0番として、左へ 0・1・2・3 と番号を振る。3E8 なら 8 が0番、E が1番、3 が2番。
A〜F を数に直す
A=10、B=11、C=12、D=13、E=14、F=15。小文字でも同じ。
重みを掛ける
0番は×1、1番は×16、2番は×256、3番は×4096。
全部足す
3×256+14×16+8×1=768+224+8=1000。
Python で各桁の掛け算を書き出し、結果を int(文字列, 16) で確かめた出力です。
2A = 2×16 + 10×1 = 42
FF = 15×16 + 15×1 = 255
3E8 = 3×256 + 14×16 + 8×1 = 1000
3F7B = 3×4096 + 15×256 + 7×16 + 11×1 = 16251
BEEF = 11×4096 + 14×256 + 14×16 + 15×1 = 48879
| 16進数 | 途中式 | 10進数 |
|---|---|---|
| 2A | 32+10 | 42 |
| FF | 240+15 | 255 |
| 3E8 | 768+224+8 | 1000 |
| 3F7B | 12288+3840+112+11 | 16251 |
手で計算するときは、左の桁から「16倍して次の桁を足す」をくり返す方法も使えます。3E8 なら、3 → 3×16+14=62 → 62×16+8=1000 です。掛け算の数が減り、桁の多い数で間違えにくくなります。
10進数を16進数に変換する方法(16で割り、余りを下から読む)
この節では、10進数を16進数に直す「割り算をくり返す方法」が、図と途中の表で分かります。
16で割り、余りを書き残し、商をまた16で割る。商が0になったら、余りを下から上へ読みます。余りが10〜15なら A〜F に置き換えます。
flowchart TD
A["1000 ÷ 16 = 62 余り 8"] -->|"商の62をまた割る"| B["62 ÷ 16 = 3 余り 14(E)"]
B -->|"商の3をまた割る"| C["3 ÷ 16 = 0 余り 3"]
C -->|"商が0で終わり"| R["余りを下から読む<br>3・E・8 → 3E8"]
Python で割り算の途中を書き出した結果です(最後の行が format(n, "X") の答え)。
--- 255
255 ÷ 16 = 15 余り 15 (F)
15 ÷ 16 = 0 余り 15 (F)
-> FF
--- 12345
12345 ÷ 16 = 771 余り 9 (9)
771 ÷ 16 = 48 余り 3 (3)
48 ÷ 16 = 3 余り 0 (0)
3 ÷ 16 = 0 余り 3 (3)
-> 3039
--- 2026
2026 ÷ 16 = 126 余り 10 (A)
126 ÷ 16 = 7 余り 14 (E)
7 ÷ 16 = 0 余り 7 (7)
-> 7EA
| 10進数 | 余り(上から順) | 下から読む | 16進数 |
|---|---|---|---|
| 42 | 10(A)、2 | 2・A | 2A |
| 255 | 15(F)、15(F) | F・F | FF |
| 1000 | 8、14(E)、3 | 3・E・8 | 3E8 |
| 2026 | 10(A)、14(E)、7 | 7・E・A | 7EA |
| 12345 | 9、3、0、3 | 3・0・3・9 | 3039 |
- 途中の余りが0でも書き残します。12345 の3回目の余りの0を落とすと「339」になり、まったく別の数(825)になります。
- 確かめ算は前の節の方法で戻すことです。3039 → 3×4096+0×256+3×16+9=12345 になれば正しく変換できています。
大きい重みから引いていく方法
255 以下の数なら、「16がいくつ入るか」を考えるだけで2桁が決まります。200 なら 16×12=192 で上の桁は C、残り 200−192=8 で下の桁は 8、答えは C8 です。Python の divmod(200, 16) も (12, 8) を返しました。
2進数と16進数の変換(4桁ずつ区切る)
この節では、2進数と16進数を、計算をせずに表を引くだけで行き来する方法が分かります。
2進数を右から4桁ずつ区切り、それぞれを16進数の1桁に置き換えます。左端が4桁に満たないときは、左に0を足して4桁にそろえます。逆に16進数から2進数へは、1桁を4桁の2進数に置き換えて並べます。
flowchart TD
S["2進数 1011111011101111"] -->|"右から4桁ずつ区切る"| G["1011 | 1110 | 1110 | 1111"]
G -->|"4桁を10進数で読む"| V["11 | 14 | 14 | 15"]
V -->|"10〜15をA〜Fに"| R["B | E | E | F → 16進数 BEEF"]
| 2進数 | 4桁ずつ区切る | 16進数 | 10進数(確かめ) |
|---|---|---|---|
| 11010110 | 1101|0110 | D6 | 214 |
| 101101 | 0010|1101 | 2D | 45 |
| 1011111011101111 | 1011|1110|1110|1111 | BEEF | 48879 |
| 11111111 | 1111|1111 | FF | 255 |
Python と bc で同じ変換をした結果です。bc は ibase(入力の基数)と obase(出力の基数)を指定します。
$ python3 -c 'print(format(0b11010110, "X"), format(0xD6, "08b"), int("101101", 2))'
D6 11010110 45
$ echo "obase=2; ibase=16; D6" | bc
11010110
区切る向きは必ず右からです。101101 を左から「1011|01」と区切ると B と 1 になり、B1(177)という誤った答えになります。
16進数の書き方(0x・#・&H・h の表記)
この節では、「この数は16進数です」と示す印が、言語や場面ごとにどう違うのかが分かります。
「10」と書いただけでは、10進数の10か16進数の10(=16)か区別できません。そのため、16進数には前か後ろに印を付けます。
| 書き方 | 使われる場所 | 255 の例 |
|---|---|---|
先頭に 0x | C・C++・Java・Python・JavaScript・Go・Rust など | 0xFF |
先頭に # | CSS・HTML のカラーコード | #FF0000(赤の成分が255) |
先頭に &H | VBA・Visual Basic | &HFF |
末尾に h | Intel 系のアセンブラ(A〜F で始まるときは先頭に0) | 0FFh |
先頭に $ | Motorola 系・6502 のアセンブラ、Pascal | $FF |
右下に小さく 16 | 教科書・試験 | FF16、(FF)16 |
16# を前に | bash の算術式 | $((16#ff)) |
手元で、印の付け方ごとに同じ255になるかを確かめました。
$ echo $((16#ff)) $((0xff)) $((2#11010110))
255 255 214
$ printf "%d\n" 0xff
255
$ node -e 'console.log(0xff, parseInt("ff", 16), Number("0xff"))'
255 255 255
A〜F は大文字でも小文字でも同じ値です。プログラムの出力は小文字(Python の hex(255) は '0xff')が多く、文書やメモリの表記では大文字がよく使われます。チームの中ではどちらかにそろえると読みやすくなります。
プログラムで16進数を変換する(Python・JavaScript・Java・C)
この節では、主な言語で「数→16進数の文字列」「16進数の文字列→数」を書く方法が、実行結果つきで分かります。
| 言語 | 数 → 16進数 | 16進数 → 数 | 2桁にそろえる |
|---|---|---|---|
| Python | hex(255)・format(255, "x") | int("ff", 16) | f"{10:02X}" |
| JavaScript | (255).toString(16) | parseInt("ff", 16) | .padStart(2, "0") |
| Java | Integer.toHexString(255) | Integer.parseInt("ff", 16) | String.format("%02X", 10) |
| C | printf("%x", 255) | strtoul("ff", NULL, 16) | printf("%02X", 10) |
| bash | printf "%x" 255 | echo $((16#ff)) | printf "%02X" 10 |
Python
print(bin(0xD6), oct(0xD6), hex(214), format(214, '08b'), format(214, '#06x'), f"{214:02X}")
print(int("0x1A", 16), int("1a", 16), int("0x1A", 0), int("0o17", 0), int("0b101", 0))
print(bytes.fromhex("e38182").decode(), "あ".encode().hex(" "))
0b11010110 0o326 0xd6 11010110 0x00d6 D6
26 26 26 15 5
あ e3 81 82
int("0x1A", 16) は先頭の 0x を付けたままでも読めました。Python の公式ドキュメントにも、16進数の文字列には 0x・0X を付けてもよいと書かれています。int(文字列, 0) にすると、0x・0o・0b の印を見て基数を自動で決めます。
JavaScript(Node.js 22)
console.log((255).toString(16), (255).toString(16).toUpperCase(), (10).toString(16).padStart(2, "0"));
console.log(parseInt("ff", 16), parseInt("0xff", 16), parseInt("0xff"), Number("0xff"), parseInt("ff"));
console.log(parseInt("1G", 16), parseInt("G1", 16), parseInt("12px", 16));
ff FF 0a
255 255 255 255 NaN
1 NaN 18
parseInt("ff") のように基数を書き忘れると、10進数として読まれて NaN になりました。parseInt は読めない文字が出たところで止まり、それまでの部分を返します。"1G" は1、"12px" は 0x12=18 になり、エラーにはなりません。
Java(OpenJDK 21)
System.out.println(Integer.toHexString(255) + " " + Integer.toHexString(-1) + " " + String.format("%02X", 10) + " " + String.format("%08x", 48879));
System.out.println(Integer.parseInt("ff", 16) + " " + Integer.parseUnsignedInt("ffffffff", 16) + " " + Long.parseLong("ffffffff", 16));
System.out.println(HexFormat.of().formatHex("あ".getBytes(StandardCharsets.UTF_8)));
System.out.println(Integer.decode("0xff") + " " + Integer.decode("#ff"));
ff ffffffff 0A 0000beef
255 -1 4294967295
e38182
255 255
Java 17 から入った java.util.HexFormat を使うと、バイト列を16進数の文字列にまとめて変換できます。Integer.decode は 0x・# の印を読み取ります。
C(gcc 13)
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(void) {
uint8_t u = 0xFF; u = u + 1; /* 8ビットに 255+1 */
int8_t s = (int8_t)0xFF; /* 符号ありとして読む */
unsigned long v = strtoul("ff8800", NULL, 16);
printf("%d %x %X %#x %02x %08X\n", 0xFF, 255, 255, 255, 10, 48879);
printf("u8 0xFF+1 = %u, int8 0xFF = %d, int8 0x80 = %d\n", u, s, (int8_t)0x80);
printf("strtoul = %lu\n", v);
return 0;
}
255 ff FF 0xff 0a 0000BEEF
u8 0xFF+1 = 0, int8 0xFF = -1, int8 0x80 = -128
strtoul = 16746496
書式の %x は小文字、%X は大文字、%#x は 0x 付き、%02x は「2桁に満たなければ0で埋める」です。この書式は bash の printf・Python の % 演算子・Java の String.format でもほぼ同じに使えます。
Excel の HEX2DEC・DEC2HEX
Excel には HEX2DEC(16進数→10進数)と DEC2HEX(10進数→16進数)の関数があります。Microsoft の公式ドキュメントでは、HEX2DEC の引数は10文字(40ビット)までで、いちばん上のビットが符号を表し、負の数は2の補数で表すと説明されています。公式の例 =HEX2DEC("A5") は165、=HEX2DEC("FFFFFFFF5B") は−165 で、Python で40ビットの2の補数として計算しても同じ 165 と −165 になりました。
コマンドで16進数を見る(printf・od・xxd・bc)
この節では、ターミナルで数を変換したり、ファイルの中身をバイトごとに16進数で見たりする方法が分かります。
ファイルの中身は、どんなファイルでも結局はバイト(0〜255)の並びです。それを1バイト2桁の16進数で並べて見るのが xxd や od です。「RJC あ」と改行だけを書いたファイルを見ました。
$ printf 'RJC あ\n' > sample.txt
$ xxd sample.txt
00000000: 524a 4320 e381 820a RJC ....
$ xxd -p sample.txt
524a4320e381820a
$ od -A x -t x1z sample.txt
000000 52 4a 43 20 e3 81 82 0a >RJC ....<
000008
$ echo -n A | xxd -b
00000000: 01000001 A
| バイト(16進数) | 10進数 | 意味 |
|---|---|---|
| 52 4a 43 | 82 74 67 | R・J・C(ASCII) |
| 20 | 32 | 空白 |
| e3 81 82 | 227 129 130 | 「あ」(UTF-8 では3バイト) |
| 0a | 10 | 改行(LF) |
逆に、16進数の文字列からバイトに戻すには xxd -r -p を使います。
$ echo -n "e38182" | xxd -r -p; echo
あ
$ printf "\xe3\x81\x82\n"
あ
$ head -c 4 /bin/ls | xxd
00000000: 7f45 4c46 .ELF
Linux の実行ファイルは、先頭の4バイトが 7f 45 4c 46(7F と「ELF」)で始まっていました。ファイルの種類を表す先頭のバイト(マジックナンバー)も、16進数で読むのが一般的です。バイナリを読む・書き換える道具の使い方は、関連記事「バイナリエディタとは|使い方・おすすめとxxdで読む実例・戻し方」で扱っています。
od のアドレスは8進数
$ od -t x1 sample.txt
0000000 52 4a 43 20 e3 81 82 0a
0000010
オプションなしの od は、左のアドレスを8進数で表示します。最後の 0000010 は「16バイト目」ではなく「8バイト目」(8進数の10=8)です。-A x を付けるとアドレスも16進数になり、上の例では 000008 と表示されました。
bc と printf で変換する
$ echo "obase=16; 1000" | bc
3E8
$ echo "ibase=16; FF" | bc
255
$ echo "ibase=16; ff" | bc
0
$ printf "%x %X %#x %02x %o\n" 255 255 255 10 255
ff FF 0xff 0a 377
bc は、16進数の入力に小文字を使うと正しく読めず、ff が0になりました。bc に渡す16進数は大文字で書きます。
16進数の計算と、負の数(2の補数)
この節では、16進数どうしの足し算・引き算のやり方と、コンピューターが負の数を16進数でどう表すのかが分かります。
足し算・引き算・掛け算
10進数と同じ筆算で計算でき、16になったら繰り上げ、借りるときは16を借ります。Python で値を確かめた例です。
| 式(16進数) | 答え(16進数) | 10進数で確かめ |
|---|---|---|
| 9 + 8 | 11 | 9+8=17 |
| 1F + 1 | 20 | 31+1=32 |
| FF + 1 | 100 | 255+1=256 |
| 100 − 1 | FF | 256−1=255 |
| 3E8 − 2A | 3BE | 1000−42=958 |
| A × A | 64 | 10×10=100 |
| FF × FF | FE01 | 255×255=65025 |
9+8 は、10進数なら17ですが、16進数では「16を1つ繰り上げて、残りが1」なので 11 です。掛け算や割り算は、10進数に直してから計算し、答えを16進数に戻すほうが間違えにくくなります。
桁あふれ:FF + 1 が 0 になる
決まった桁数(ビット数)の入れ物では、上にあふれた桁は捨てられます。C 言語で8ビットの符号なし整数(uint8_t)に 0xFF を入れて1を足すと、0x100 の「1」が入りきらず、0 になりました(前の節の出力)。
2の補数で負の数を表す
コンピューターは、負の数を「2の補数」で表すのが一般的です。8ビットなら、正の数の各ビットを反転して1を足したものが、その数の負の値になります。
5 を2進数にする
00000101(16進数で 05)
ビットを反転する
11111010(0と1を入れ替える)
1を足す
11111011 = 16進数で FB。これが8ビットの −5。
Python で、1バイトの値を「符号なし」と「符号あり(2の補数)」で読み比べました(int.from_bytes(..., signed=True))。
| 16進数 | 2進数 | 符号なし | 符号あり |
|---|---|---|---|
| 00 | 00000000 | 0 | 0 |
| 01 | 00000001 | 1 | 1 |
| 7F | 01111111 | 127 | 127 |
| 80 | 10000000 | 128 | −128 |
| 81 | 10000001 | 129 | −127 |
| FE | 11111110 | 254 | −2 |
| FF | 11111111 | 255 | −1 |
符号なしとして読む
8ビットで 0〜255(00〜FF)
FF は 255
C の uint8_t、Java の Byte.toUnsignedInt
符号あり(2の補数)として読む
8ビットで −128〜127
80〜FF が負の数。FF は −1
C の int8_t、Java の byte
同じ FF でも、どう読むかで 255 にも −1 にもなります。16進数の見た目からは決まらず、変数の型(入れ物の約束)で決まります。各言語の結果も、この表と同じでした。
Python : hex(-1) -> -0x1 / format(-1 & 0xFFFFFFFF, "x") -> ffffffff
JS : (-1).toString(16) -> -1 / (-1 >>> 0).toString(16) -> ffffffff
Java : Integer.toHexString(-1) -> ffffffff / (byte)0xFF -> -1
C : (int8_t)0xFF -> -1 / (unsigned)-1 を %x -> ffffffff
bash : printf "%x\n" -1 -> ffffffffffffffff
Python と JavaScript は、負の数をそのまま「−1」の16進数として書きます。2の補数の形で見たいときは、& 0xFF(8ビット)や & 0xFFFFFFFF(32ビット)でビット数を決めてから変換します。ビットの並びを直接操作する方法は、関連記事「Javaビット演算入門|シフト演算>>と>>>の違いとフラグ管理」で扱っています。
16進数の小数
小数点より右の桁の重みは 1/16、1/256 … です。16進数の 0.8 は 8/16=0.5、0.C8 は 12/16+8/256=0.78125 です。逆に10進数の 0.1 を16進数にすると、0.1999… と9が続く割り切れない小数になりました。
Python : float.hex(0.1) -> 0x1.999999999999ap-4
JS : (0.1).toString(16) -> 0.1999999999999a
Python : 0.1 を16倍して整数部を取る、を8回 -> 0.19999999...(16)
コンピューターの小数(浮動小数点数)は内部が2進数のため、0.1 をぴったり表せません。16進数で見ると、その「割り切れなさ」が 999… として目に見えます。関連記事「浮動小数点数とは|仕組み・誤差・0.1+0.2の理由を4言語で実演」で扱っています。
16進数が使われる場所(カラーコード・文字コード・MACアドレス・メモリ)
この節では、身近な16進数の実物を読み、それぞれ何を表しているのかが分かります。
カラーコード
#ff8800。2桁ずつ赤・緑・青の強さ(0〜255)。
CSS・デザインツール
文字コード
「あ」は U+3042、UTF-8 では E3 81 82。
文字化けの調査
MACアドレス
02:42:ac:11:00:02。1バイトずつ6つ。
ネットワーク機器
メモリアドレス
0x7ffeec94d7a0。変数の置き場所の番号。
デバッグ
カラーコード(#ff8800)
CSS のカラーコード #RRGGBB は、赤(RR)・緑(GG)・青(BB)の強さを、それぞれ2桁の16進数(00〜FF=0〜255)で書いたものです。#ff8800 は、赤 ff=255、緑 88=136、青 00=0 のオレンジです。Chromium で色を指定し、ブラウザが計算した値(getComputedStyle)を読みました。
| 指定した値 | Chromium が計算した色 | 読み方 |
|---|---|---|
#ff8800 | rgb(255, 136, 0) | RRGGBB |
#FF8800 | rgb(255, 136, 0) | 大文字でも同じ |
#f80 | rgb(255, 136, 0) | 3桁は各桁を2つ重ねる(f→ff、8→88) |
#ff880080 | rgba(255, 136, 0, 0.5) | 最後の2桁が不透明度(80=128) |
#f808 | rgba(255, 136, 0, 0.533) | 4桁は #RGBA(8→88=136) |
#ff88 | rgba(255, 255, 136, 0.533) | 4桁なので #RGBA と読まれた |
#gg8800・#ff88000 | 無効(指定前の色のまま) | g は16進数でない・7桁は形が無い |
JavaScript で、カラーコードを RGB の数に分け、また戻す処理です。
const hex = "#ff8800";
const [r, g, b] = [1, 3, 5].map(i => parseInt(hex.slice(i, i + 2), 16));
console.log(r, g, b); // 255 136 0
console.log("#" + [255, 136, 0].map(v => v.toString(16).padStart(2, "0")).join("")); // #ff8800
padStart(2, "0") を忘れると、0 が "0" の1文字になり、#ff880 という5桁の誤ったコードになります。不透明度の 80 は 128/255 で、0.502 を Chromium は 0.5 と表示しました。rgb・hsl などほかの書き方は、関連記事「CSSの色指定まとめ|rgb・hsl・カラーコードと透明度の書き方」で扱っています。
文字コード(Unicode と UTF-8 のバイト)
文字の番号(コードポイント)は U+3042 のように16進数で書き、ファイルに保存されるバイトも16進数で表します。Python で、同じ文字を3つの文字コードにしたときのバイトを並べました。
| 文字 | コードポイント | UTF-8 | UTF-16(BE) | Shift_JIS |
|---|---|---|---|---|
| A | U+0041 | 41 | 00 41 | 41 |
| é | U+00E9 | C3 A9 | 00 E9 | ― |
| あ | U+3042 | E3 81 82 | 30 42 | 82 A0 |
| 漢 | U+6F22 | E6 BC A2 | 6F 22 | 8A BF |
| € | U+20AC | E2 82 AC | 20 AC | ― |
| 😀 | U+1F600 | F0 9F 98 80 | D8 3D DE 00 | ― |
「あ」は、UTF-8 なら E3 81 82、Shift_JIS なら 82 A0 です。文字化けしたファイルを xxd で見て、日本語が3バイトずつなら UTF-8、2バイトずつなら Shift_JIS の可能性が高い、と見当を付けられます。😀 は JavaScript では "😀".length が2(UTF-16 の2単位)、codePointAt(0).toString(16) は 1f600 でした。文字化けの原因の切り分けは、関連記事「文字化けの原因8選|濁点分離・utf8mb4・絵文字の文字数」で扱っています。
MAC アドレス
MAC アドレスは、ネットワーク機器に付く6バイト(48ビット)の番号で、1バイトずつ2桁の16進数をコロンで区切って書きます。ip netns の中に仮想のインターフェースを2つ作り、1つには MAC アドレスを手で設定しました。
$ ip -n t44ns -br link
lo DOWN 00:00:00:00:00:00 <LOOPBACK>
v1@v0 UP 6a:60:7e:4d:39:19 <BROADCAST,MULTICAST,UP,LOWER_UP>
v0@v1 UP 02:42:ac:11:00:02 <BROADCAST,MULTICAST,UP,LOWER_UP>
先頭の1バイトを2進数にすると、いちばん下の2ビットに意味があります(IEEE 802 の決まり。RFC 7042 にも説明があります)。Python で読みました。
| MAC アドレス | 先頭バイトの2進数 | 最下位ビット | 下から2番目のビット |
|---|---|---|---|
| 6a:60:7e:4d:39:19(自動で付いた) | 01101010 | 0=1台あて(ユニキャスト) | 1=ローカルで決めた番号 |
| 02:42:ac:11:00:02(手で設定) | 00000010 | 0=ユニキャスト | 1=ローカルで決めた番号 |
| ff:ff:ff:ff:ff:ff | 11111111 | 1=全員あて(ブロードキャスト) | 1 |
仮想インターフェースに自動で付いた番号は、下から2番目のビットが1(ローカルで決めた番号)でした。メーカーが割り当てる番号では、このビットが0で、先頭の3バイトがメーカーの番号(OUI)になります。IPv6 アドレスも16ビットずつ16進数で書き、Python の ipaddress で 2001:db8::1 を省略せずに書くと 2001:0db8:0000:0000:0000:0000:0000:0001 になりました。
メモリアドレスとファイルの権限
C 言語で変数の場所(アドレス)を %p で表示すると、0x7ffeec94d7a0 のような16進数になりました。同じプログラムをもう一度動かすと 0x7fff58dfe2c0 になり、値は毎回変わりました(Linux がアドレスをわざとばらばらにする仕組みのためです)。/proc/self/maps の範囲 55c5e8fa4000-55c5e8fa6000 も16進数です。
ファイルの権限は8進数で書くのがふつうですが、stat -c "%a %f" では 644 81a4 と、8進数と16進数の両方が出ました。0x81a4 を8進数にすると 0o100644 で、下の3桁が 644 です。権限の数字の意味は、関連記事「chmodの755と644の意味|用途別パーミッション早見表」で扱っています。
よくある間違いとエラー(0x・大文字小文字・桁あふれ)
この節では、16進数を扱うときにつまずきやすい点と、手元で出たエラーの原文、どの方法を使うかの判断表が分かります。
| やったこと | 出た結果・エラー(原文) | 原因と直し方 |
|---|---|---|
Python int("1A") | ValueError: invalid literal for int() with base 10: '1A' | 基数の指定忘れ。int("1A", 16) |
Python int("1G", 16) | ValueError: invalid literal for int() with base 16: '1G' | G は16進数でない。入力を確かめる |
Python int("0x", 16)・int("", 16) | ValueError: invalid literal for int() with base 16: '0x' | 数字の部分が空。空文字を先に弾く |
Python x = 0x0.8 | SyntaxError: invalid syntax | 16進数の小数は書けない。float.fromhex("0x0.8p0") を使う |
Python (256).to_bytes(1, "big") | OverflowError: int too big to convert | 1バイトは255まで。バイト数を増やす |
JavaScript parseInt("ff") | NaN | 基数の指定忘れ。parseInt("ff", 16) |
Java Integer.parseInt("ffffffff", 16) | java.lang.NumberFormatException: For input string: "ffffffff" under radix 16 | int の上限超え。parseUnsignedInt か Long.parseLong |
Java Integer.parseInt("0xff", 16) | java.lang.NumberFormatException: For input string: "0xff" under radix 16 | 0x は読めない。外すか Integer.decode |
bash echo $((16#1G)) | 16#1G: value too great for base (error token is "16#1G") | G は16進数の数字でない |
bash printf "%d\n" ff | printf: ff: invalid number(と 0 を出力) | 0x を付けて 0xff |
bc ibase=16; ff | 0(エラーにならない) | 大文字で FF |
エラーにならない間違いに注意
parseInt("12px", 16) の18、bc の ff の0、8ビットの FF+1 の0をそのまま使う/^[0-9a-fA-F]+$/ に合うかを先に確かめ、桁数(ビット数)の上限を決めてから変換するエラーで止まる間違いより、黙って別の値になる間違いのほうが見つけにくい
全角の数字は Python では読める
Python の int("12", 16) は、全角の「12」を読んで18を返しました。一方、全角の「A」を含む int("1A", 16) は ValueError: invalid literal for int() with base 16: '1A' でした。Python の公式ドキュメントにも、0〜9 は Unicode の10進数字なら何でもよく、10〜35 は a〜z(A〜Z)で表すと書かれています。フォームから受け取った値を変換するときは、先に半角にそろえてから変換すると、結果がぶれません。
DOCTYPE の無いページでは「#」の無い色が通る
Chromium で、<!doctype html> のある標準モードのページで color に ff8800(# 無し)を指定すると、無効として無視されました。DOCTYPE の無い後方互換モード(Quirks モード)のページでは、同じ指定が rgb(255, 136, 0) として通りました。WHATWG の Quirks Mode Standard の「hashless hex color quirk」による動きで、CSS Color Level 4 では非推奨の互換動作として扱われています。カラーコードには必ず # を付けます。
どの方法で変換するかの判断表
| 場面 | 向いている方法 | 理由 |
|---|---|---|
| 試験・授業で手計算 | 対応表(0〜F)+割り算・位の重み | 途中式が残り、確かめ算ができる |
| 2進数との行き来 | 4桁ずつ区切る | 計算が要らない |
| 1つの数をすぐ知りたい | printf "%x"・python3 -c | ターミナルだけで終わる |
| ファイルの中身を見る | xxd・od -A x -t x1z | バイトごとに2桁で並ぶ |
| プログラムの中で変換 | 各言語の標準関数(自作しない) | 負の数・桁あふれの扱いが決まっている |
| 表計算で変換 | Excel の HEX2DEC・DEC2HEX | 10文字(40ビット)まで |
| 色を決める | デザインツールのカラーピッカー | #RRGGBB を手で作らずに済む |
- 1基数(16)を指定したかint・parseInt・parseInt(Java) は書き忘れると10進数として読む
- 20x・# を外すか付けるか決めたかPython は 0x 付きでも読めた。Java の parseInt は読めなかった
- 3桁数をそろえたか1バイトは2桁。0A を A と書くと、つなげたときに位置がずれる
- 4符号ありか符号なしか決めたかFF は 255 にも −1 にもなる。型で決まる
- 5逆変換で元に戻るか確かめたか0〜255 は Python で全部、元の数に戻ることを確かめた
16進数の変換早見表(0〜255)
この節では、1バイトで表せる0〜255のすべての数について、10進数・16進数・2進数・8進数と、ASCII の文字の対応が一覧で分かります。
この表は Python で生成し、bash(printf と bc)と Node.js でも同じ表を作って、3つが完全に一致することを確かめました。生成に使ったコードです。
for n in range(256):
print(n, format(n, "02X"), format(n, "08b"), format(n, "o"))
$ md5sum py.tsv sh.tsv js.tsv
12ffb7ace9f8bcb944e64789a5dd006e py.tsv
12ffb7ace9f8bcb944e64789a5dd006e sh.tsv
12ffb7ace9f8bcb944e64789a5dd006e js.tsv
文字の列は ASCII(0x00〜0x7F)の文字です。0x00〜0x1F と 0x7F は画面に出ない制御文字で、主なものだけ名前を書きました。0x80〜0xFF は ASCII に無く、UTF-8 では単独では文字にならないため「-」にしています。
| 10進数 | 16進数 | 2進数 | 8進数 | 文字 |
|---|---|---|---|---|
| 0 | 00 | 00000000 | 0 | NUL |
| 1 | 01 | 00000001 | 1 | 制御文字 |
| 2 | 02 | 00000010 | 2 | 制御文字 |
| 3 | 03 | 00000011 | 3 | 制御文字 |
| 4 | 04 | 00000100 | 4 | 制御文字 |
| 5 | 05 | 00000101 | 5 | 制御文字 |
| 6 | 06 | 00000110 | 6 | 制御文字 |
| 7 | 07 | 00000111 | 7 | 制御文字 |
| 8 | 08 | 00001000 | 10 | 制御文字 |
| 9 | 09 | 00001001 | 11 | TAB(タブ) |
| 10 | 0A | 00001010 | 12 | LF(改行) |
| 11 | 0B | 00001011 | 13 | 制御文字 |
| 12 | 0C | 00001100 | 14 | 制御文字 |
| 13 | 0D | 00001101 | 15 | CR(復帰) |
| 14 | 0E | 00001110 | 16 | 制御文字 |
| 15 | 0F | 00001111 | 17 | 制御文字 |
| 16 | 10 | 00010000 | 20 | 制御文字 |
| 17 | 11 | 00010001 | 21 | 制御文字 |
| 18 | 12 | 00010010 | 22 | 制御文字 |
| 19 | 13 | 00010011 | 23 | 制御文字 |
| 20 | 14 | 00010100 | 24 | 制御文字 |
| 21 | 15 | 00010101 | 25 | 制御文字 |
| 22 | 16 | 00010110 | 26 | 制御文字 |
| 23 | 17 | 00010111 | 27 | 制御文字 |
| 24 | 18 | 00011000 | 30 | 制御文字 |
| 25 | 19 | 00011001 | 31 | 制御文字 |
| 26 | 1A | 00011010 | 32 | 制御文字 |
| 27 | 1B | 00011011 | 33 | ESC |
| 28 | 1C | 00011100 | 34 | 制御文字 |
| 29 | 1D | 00011101 | 35 | 制御文字 |
| 30 | 1E | 00011110 | 36 | 制御文字 |
| 31 | 1F | 00011111 | 37 | 制御文字 |
| 32 | 20 | 00100000 | 40 | (空白) |
| 33 | 21 | 00100001 | 41 | ! |
| 34 | 22 | 00100010 | 42 | " |
| 35 | 23 | 00100011 | 43 | # |
| 36 | 24 | 00100100 | 44 | $ |
| 37 | 25 | 00100101 | 45 | % |
| 38 | 26 | 00100110 | 46 | & |
| 39 | 27 | 00100111 | 47 | ' |
| 40 | 28 | 00101000 | 50 | ( |
| 41 | 29 | 00101001 | 51 | ) |
| 42 | 2A | 00101010 | 52 | * |
| 43 | 2B | 00101011 | 53 | + |
| 44 | 2C | 00101100 | 54 | , |
| 45 | 2D | 00101101 | 55 | - |
| 46 | 2E | 00101110 | 56 | . |
| 47 | 2F | 00101111 | 57 | / |
| 48 | 30 | 00110000 | 60 | 0 |
| 49 | 31 | 00110001 | 61 | 1 |
| 50 | 32 | 00110010 | 62 | 2 |
| 51 | 33 | 00110011 | 63 | 3 |
| 52 | 34 | 00110100 | 64 | 4 |
| 53 | 35 | 00110101 | 65 | 5 |
| 54 | 36 | 00110110 | 66 | 6 |
| 55 | 37 | 00110111 | 67 | 7 |
| 56 | 38 | 00111000 | 70 | 8 |
| 57 | 39 | 00111001 | 71 | 9 |
| 58 | 3A | 00111010 | 72 | : |
| 59 | 3B | 00111011 | 73 | ; |
| 60 | 3C | 00111100 | 74 | < |
| 61 | 3D | 00111101 | 75 | = |
| 62 | 3E | 00111110 | 76 | > |
| 63 | 3F | 00111111 | 77 | ? |
| 64 | 40 | 01000000 | 100 | @ |
| 65 | 41 | 01000001 | 101 | A |
| 66 | 42 | 01000010 | 102 | B |
| 67 | 43 | 01000011 | 103 | C |
| 68 | 44 | 01000100 | 104 | D |
| 69 | 45 | 01000101 | 105 | E |
| 70 | 46 | 01000110 | 106 | F |
| 71 | 47 | 01000111 | 107 | G |
| 72 | 48 | 01001000 | 110 | H |
| 73 | 49 | 01001001 | 111 | I |
| 74 | 4A | 01001010 | 112 | J |
| 75 | 4B | 01001011 | 113 | K |
| 76 | 4C | 01001100 | 114 | L |
| 77 | 4D | 01001101 | 115 | M |
| 78 | 4E | 01001110 | 116 | N |
| 79 | 4F | 01001111 | 117 | O |
| 80 | 50 | 01010000 | 120 | P |
| 81 | 51 | 01010001 | 121 | Q |
| 82 | 52 | 01010010 | 122 | R |
| 83 | 53 | 01010011 | 123 | S |
| 84 | 54 | 01010100 | 124 | T |
| 85 | 55 | 01010101 | 125 | U |
| 86 | 56 | 01010110 | 126 | V |
| 87 | 57 | 01010111 | 127 | W |
| 88 | 58 | 01011000 | 130 | X |
| 89 | 59 | 01011001 | 131 | Y |
| 90 | 5A | 01011010 | 132 | Z |
| 91 | 5B | 01011011 | 133 | [ |
| 92 | 5C | 01011100 | 134 | \ |
| 93 | 5D | 01011101 | 135 | ] |
| 94 | 5E | 01011110 | 136 | ^ |
| 95 | 5F | 01011111 | 137 | _ |
| 96 | 60 | 01100000 | 140 | ` |
| 97 | 61 | 01100001 | 141 | a |
| 98 | 62 | 01100010 | 142 | b |
| 99 | 63 | 01100011 | 143 | c |
| 100 | 64 | 01100100 | 144 | d |
| 101 | 65 | 01100101 | 145 | e |
| 102 | 66 | 01100110 | 146 | f |
| 103 | 67 | 01100111 | 147 | g |
| 104 | 68 | 01101000 | 150 | h |
| 105 | 69 | 01101001 | 151 | i |
| 106 | 6A | 01101010 | 152 | j |
| 107 | 6B | 01101011 | 153 | k |
| 108 | 6C | 01101100 | 154 | l |
| 109 | 6D | 01101101 | 155 | m |
| 110 | 6E | 01101110 | 156 | n |
| 111 | 6F | 01101111 | 157 | o |
| 112 | 70 | 01110000 | 160 | p |
| 113 | 71 | 01110001 | 161 | q |
| 114 | 72 | 01110010 | 162 | r |
| 115 | 73 | 01110011 | 163 | s |
| 116 | 74 | 01110100 | 164 | t |
| 117 | 75 | 01110101 | 165 | u |
| 118 | 76 | 01110110 | 166 | v |
| 119 | 77 | 01110111 | 167 | w |
| 120 | 78 | 01111000 | 170 | x |
| 121 | 79 | 01111001 | 171 | y |
| 122 | 7A | 01111010 | 172 | z |
| 123 | 7B | 01111011 | 173 | { |
| 124 | 7C | 01111100 | 174 | | |
| 125 | 7D | 01111101 | 175 | } |
| 126 | 7E | 01111110 | 176 | ~ |
| 127 | 7F | 01111111 | 177 | DEL |
| 128 | 80 | 10000000 | 200 | - |
| 129 | 81 | 10000001 | 201 | - |
| 130 | 82 | 10000010 | 202 | - |
| 131 | 83 | 10000011 | 203 | - |
| 132 | 84 | 10000100 | 204 | - |
| 133 | 85 | 10000101 | 205 | - |
| 134 | 86 | 10000110 | 206 | - |
| 135 | 87 | 10000111 | 207 | - |
| 136 | 88 | 10001000 | 210 | - |
| 137 | 89 | 10001001 | 211 | - |
| 138 | 8A | 10001010 | 212 | - |
| 139 | 8B | 10001011 | 213 | - |
| 140 | 8C | 10001100 | 214 | - |
| 141 | 8D | 10001101 | 215 | - |
| 142 | 8E | 10001110 | 216 | - |
| 143 | 8F | 10001111 | 217 | - |
| 144 | 90 | 10010000 | 220 | - |
| 145 | 91 | 10010001 | 221 | - |
| 146 | 92 | 10010010 | 222 | - |
| 147 | 93 | 10010011 | 223 | - |
| 148 | 94 | 10010100 | 224 | - |
| 149 | 95 | 10010101 | 225 | - |
| 150 | 96 | 10010110 | 226 | - |
| 151 | 97 | 10010111 | 227 | - |
| 152 | 98 | 10011000 | 230 | - |
| 153 | 99 | 10011001 | 231 | - |
| 154 | 9A | 10011010 | 232 | - |
| 155 | 9B | 10011011 | 233 | - |
| 156 | 9C | 10011100 | 234 | - |
| 157 | 9D | 10011101 | 235 | - |
| 158 | 9E | 10011110 | 236 | - |
| 159 | 9F | 10011111 | 237 | - |
| 160 | A0 | 10100000 | 240 | - |
| 161 | A1 | 10100001 | 241 | - |
| 162 | A2 | 10100010 | 242 | - |
| 163 | A3 | 10100011 | 243 | - |
| 164 | A4 | 10100100 | 244 | - |
| 165 | A5 | 10100101 | 245 | - |
| 166 | A6 | 10100110 | 246 | - |
| 167 | A7 | 10100111 | 247 | - |
| 168 | A8 | 10101000 | 250 | - |
| 169 | A9 | 10101001 | 251 | - |
| 170 | AA | 10101010 | 252 | - |
| 171 | AB | 10101011 | 253 | - |
| 172 | AC | 10101100 | 254 | - |
| 173 | AD | 10101101 | 255 | - |
| 174 | AE | 10101110 | 256 | - |
| 175 | AF | 10101111 | 257 | - |
| 176 | B0 | 10110000 | 260 | - |
| 177 | B1 | 10110001 | 261 | - |
| 178 | B2 | 10110010 | 262 | - |
| 179 | B3 | 10110011 | 263 | - |
| 180 | B4 | 10110100 | 264 | - |
| 181 | B5 | 10110101 | 265 | - |
| 182 | B6 | 10110110 | 266 | - |
| 183 | B7 | 10110111 | 267 | - |
| 184 | B8 | 10111000 | 270 | - |
| 185 | B9 | 10111001 | 271 | - |
| 186 | BA | 10111010 | 272 | - |
| 187 | BB | 10111011 | 273 | - |
| 188 | BC | 10111100 | 274 | - |
| 189 | BD | 10111101 | 275 | - |
| 190 | BE | 10111110 | 276 | - |
| 191 | BF | 10111111 | 277 | - |
| 192 | C0 | 11000000 | 300 | - |
| 193 | C1 | 11000001 | 301 | - |
| 194 | C2 | 11000010 | 302 | - |
| 195 | C3 | 11000011 | 303 | - |
| 196 | C4 | 11000100 | 304 | - |
| 197 | C5 | 11000101 | 305 | - |
| 198 | C6 | 11000110 | 306 | - |
| 199 | C7 | 11000111 | 307 | - |
| 200 | C8 | 11001000 | 310 | - |
| 201 | C9 | 11001001 | 311 | - |
| 202 | CA | 11001010 | 312 | - |
| 203 | CB | 11001011 | 313 | - |
| 204 | CC | 11001100 | 314 | - |
| 205 | CD | 11001101 | 315 | - |
| 206 | CE | 11001110 | 316 | - |
| 207 | CF | 11001111 | 317 | - |
| 208 | D0 | 11010000 | 320 | - |
| 209 | D1 | 11010001 | 321 | - |
| 210 | D2 | 11010010 | 322 | - |
| 211 | D3 | 11010011 | 323 | - |
| 212 | D4 | 11010100 | 324 | - |
| 213 | D5 | 11010101 | 325 | - |
| 214 | D6 | 11010110 | 326 | - |
| 215 | D7 | 11010111 | 327 | - |
| 216 | D8 | 11011000 | 330 | - |
| 217 | D9 | 11011001 | 331 | - |
| 218 | DA | 11011010 | 332 | - |
| 219 | DB | 11011011 | 333 | - |
| 220 | DC | 11011100 | 334 | - |
| 221 | DD | 11011101 | 335 | - |
| 222 | DE | 11011110 | 336 | - |
| 223 | DF | 11011111 | 337 | - |
| 224 | E0 | 11100000 | 340 | - |
| 225 | E1 | 11100001 | 341 | - |
| 226 | E2 | 11100010 | 342 | - |
| 227 | E3 | 11100011 | 343 | - |
| 228 | E4 | 11100100 | 344 | - |
| 229 | E5 | 11100101 | 345 | - |
| 230 | E6 | 11100110 | 346 | - |
| 231 | E7 | 11100111 | 347 | - |
| 232 | E8 | 11101000 | 350 | - |
| 233 | E9 | 11101001 | 351 | - |
| 234 | EA | 11101010 | 352 | - |
| 235 | EB | 11101011 | 353 | - |
| 236 | EC | 11101100 | 354 | - |
| 237 | ED | 11101101 | 355 | - |
| 238 | EE | 11101110 | 356 | - |
| 239 | EF | 11101111 | 357 | - |
| 240 | F0 | 11110000 | 360 | - |
| 241 | F1 | 11110001 | 361 | - |
| 242 | F2 | 11110010 | 362 | - |
| 243 | F3 | 11110011 | 363 | - |
| 244 | F4 | 11110100 | 364 | - |
| 245 | F5 | 11110101 | 365 | - |
| 246 | F6 | 11110110 | 366 | - |
| 247 | F7 | 11110111 | 367 | - |
| 248 | F8 | 11111000 | 370 | - |
| 249 | F9 | 11111001 | 371 | - |
| 250 | FA | 11111010 | 372 | - |
| 251 | FB | 11111011 | 373 | - |
| 252 | FC | 11111100 | 374 | - |
| 253 | FD | 11111101 | 375 | - |
| 254 | FE | 11111110 | 376 | - |
| 255 | FF | 11111111 | 377 | - |
よくある質問
Q. 16進数とは何ですか? A. 0〜9 と A〜F(10〜15)の16種類の記号を使い、16になると桁が上がる数の書き方です。16進数の1桁は2進数の4桁に当たり、1バイトを2桁で書けるため、コンピューターの世界でよく使われます。
Q. 16進数と16進法の違いは何ですか? A. 16進法は「16で繰り上がる数え方」の名前、16進数は「その数え方で書いた数」です。ふだんはほぼ同じ意味で使われます。
Q. 16進数を10進数に変換する方法は? A. 各桁の値(A〜F は10〜15)に、右から 1・16・256・4096 … の重みを掛けて足します。3E8 は 3×256+14×16+8=1000 です。
Q. 10進数を16進数に変換する方法は? A. 16で割って余りを書き、商をまた16で割ることを商が0になるまで続け、余りを下から読みます。1000 は余りが 8・14(E)・3 なので 3E8 です。
Q. 2進数を16進数に変換するには? A. 右から4桁ずつ区切り、4桁を16進数の1桁に置き換えます。11010110 は 1101|0110 で D6 です。左端が4桁に満たないときは左に0を足します。
Q. 0x は何の意味ですか? A. 「この後ろの数は16進数です」という印で、C・Java・Python・JavaScript などで使います。0xFF は255です。値の一部ではありません。
Q. カラーコードの #ff8800 はどう読みますか? A. 2桁ずつ、赤 ff(255)・緑 88(136)・青 00(0)です。Chromium でも rgb(255, 136, 0) と計算されました。8桁なら最後の2桁が不透明度です。
Q. 16進数の FF は 255 ですか、−1 ですか? A. どちらにもなります。符号なしの8ビットなら255、2の補数を使う符号ありの8ビットなら−1です。16進数の見た目ではなく、変数の型で決まります。
Q. A〜F は大文字と小文字のどちらで書きますか?
A. 値はどちらも同じです。ただし bc のように大文字しか正しく読まない道具もあり、手元では bc に ff を渡すと0になりました。チームの決まりにそろえます。
Q. 16進数の早見表はどこまで覚えればよいですか? A. 0〜F と2進数4桁の対応(16通り)を覚えると、2進数との変換は表を見ずにできます。あとは 10=16、FF=255、100=256 を押さえると、多くの値の見当が付きます。
Q. 16進数を電卓で計算できますか?
A. 基数を切り替えられる電卓なら計算できます。ターミナルが使えるなら printf "%x\n" 1000(3e8)や python3 -c 'print(int("3E8", 16))'(1000)がすぐに使えます。
まとめ
- 16進数は 0〜9・A〜F の16種類で数え、16で桁が上がる。1桁が2進数の4桁に当たり、1バイトを2桁で書ける。
- 16進数→10進数は「各桁×16のべき乗を足す」、10進数→16進数は「16で割って余りを下から読む」、2進数⇄16進数は「右から4桁ずつ区切る」。
- Python は
int(s, 16)・format(n, "X")、JavaScript はparseInt(s, 16)・toString(16)。基数の指定忘れは Python ではエラー、JavaScript では NaN になった。 - FF は符号なしなら255、2の補数の符号ありなら−1。8ビットの FF+1 は桁あふれで0になる。
- カラーコード・UTF-8 のバイト・MAC アドレス・メモリアドレスはどれも16進数。
xxdでファイルを見ると、文字コードの見当も付けられる。
参考・出典
確認日はいずれも 2026年10月29日です。
- Python ドキュメント「Built-in Functions」int()・hex()・format():https://docs.python.org/3/library/functions.html
- Python ドキュメント「float.hex()・float.fromhex()」:https://docs.python.org/3/library/stdtypes.html#float.hex
- MDN「parseInt()」:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt
- MDN「Number.prototype.toString()」:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toString
- MDN「<hex-color>」:https://developer.mozilla.org/ja/docs/Web/CSS/hex-color
- Oracle「Java SE 21 API Integer」:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Integer.html
- Oracle「Java SE 21 API HexFormat」:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/HexFormat.html
- GNU Bash マニュアル「Shell Arithmetic」:https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html
- GNU coreutils「od: Write files in octal or other formats」:https://www.gnu.org/software/coreutils/manual/html_node/od-invocation.html
- Microsoft サポート「HEX2DEC 関数」:https://support.microsoft.com/en-us/excel/functions/hex2dec-function
- WHATWG「Quirks Mode Standard」:https://quirks.spec.whatwg.org/
- IETF「RFC 3629 UTF-8, a transformation format of ISO 10646」:https://www.rfc-editor.org/rfc/rfc3629
- IETF「RFC 7042 IANA Considerations and IETF Protocol and Documentation Usage for IEEE 802 Parameters」:https://www.rfc-editor.org/rfc/rfc7042
- IETF「RFC 9226 Bioctal: Hexadecimal 2.0」:https://www.rfc-editor.org/rfc/rfc9226
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「16進数とは|変換の手順を図解・5言語で実行・早見表0〜255」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。