結論

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の早見表

2026年10月29日更新|Python 3.13・Node.js 22・Java 21・gcc 13・Chromium 153で実行確認

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〜90〜9(同じ)1610(ここで繰り上がる)
10A1711
11B2519
12C261A
13D311F
14E3220
15F255FF(2桁の最大)

「10」の読み方に注意

誤り16進数の「10」を「じゅう」と読み、10個だと思う
↔
正しくは16進数の「10」は16個。「いち・ゼロ」と1桁ずつ読むと取り違えにくい

見分ける問い:「この10は、何で繰り上がった10か」

位の重みは16のべき乗

10進数の 345 が「3×100+4×10+5×1」であるのと同じく、16進数の各桁には「16のべき乗」の重みがあります。右から 1、16、256、4096、65536 … です。

桁(右から) 重み 10進数での値
1桁目1601
2桁目16116
3桁目162256
4桁目1634,096
5桁目16465,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進数
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000810
91001911
101010A12
111011B13
121100C14
131101D15
141110E16
151111F17

同じ数を書くのに必要な桁数(実測)

Python で、各ビット数の最大値を2進数・10進数・16進数で書いたときの桁数を数えました。

2桁1バイト(8ビット)の16進数2進数は8桁、10進数は最大3桁
8桁32ビットの最大値 FFFFFFFF10進数では 4294967295(10桁)
16桁64ビットの最大値2進数では64桁、10進数では20桁
ビット数 2進数の桁数 10進数の桁数 16進数の桁数 16進数での最大値
8832FF
161654FFFF
3232108FFFFFFFF
64642016FFFFFFFFFFFFFFFF

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のべき乗)を掛けて、全部足します。

1

桁に番号を振る

右端を0番として、左へ 0・1・2・3 と番号を振る。3E8 なら 8 が0番、E が1番、3 が2番。

右から数える

2

A〜F を数に直す

A=10、B=11、C=12、D=13、E=14、F=15。小文字でも同じ。

対応表を見る

3

重みを掛ける

0番は×1、1番は×16、2番は×256、3番は×4096。

16のべき乗

4

全部足す

3×256+14×16+8×1=768+224+8=1000。

答えは10進数

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進数
2A32+1042
FF240+15255
3E8768+224+81000
3F7B12288+3840+112+1116251

手で計算するときは、左の桁から「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進数
4210(A)、22・A2A
25515(F)、15(F)F・FFF
10008、14(E)、33・E・83E8
202610(A)、14(E)、77・E・A7EA
123459、3、0、33・0・3・93039
  • 途中の余りが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進数(確かめ)
110101101101|0110D6214
1011010010|11012D45
10111110111011111011|1110|1110|1111BEEF48879
111111111111|1111FF255

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 の例
先頭に 0xC・C++・Java・Python・JavaScript・Go・Rust など0xFF
先頭に #CSS・HTML のカラーコード#FF0000(赤の成分が255)
先頭に &HVBA・Visual Basic&HFF
末尾に hIntel 系のアセンブラ(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桁にそろえる
Pythonhex(255)・format(255, "x")int("ff", 16)f"{10:02X}"
JavaScript(255).toString(16)parseInt("ff", 16).padStart(2, "0")
JavaInteger.toHexString(255)Integer.parseInt("ff", 16)String.format("%02X", 10)
Cprintf("%x", 255)strtoul("ff", NULL, 16)printf("%02X", 10)
bashprintf "%x" 255echo $((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 4382 74 67R・J・C(ASCII)
2032空白
e3 81 82227 129 130「あ」(UTF-8 では3バイト)
0a10改行(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 + 8119+8=17
1F + 12031+1=32
FF + 1100255+1=256
100 − 1FF256−1=255
3E8 − 2A3BE1000−42=958
A × A6410×10=100
FF × FFFE01255×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を足したものが、その数の負の値になります。

1

5 を2進数にする

00000101(16進数で 05)

8ビット

2

ビットを反転する

11111010(0と1を入れ替える)

1の補数

3

1を足す

11111011 = 16進数で FB。これが8ビットの −5。

2の補数

Python で、1バイトの値を「符号なし」と「符号あり(2の補数)」で読み比べました(int.from_bytes(..., signed=True))。

16進数 2進数 符号なし 符号あり
000000000000
010000000111
7F01111111127127
8010000000128−128
8110000001129−127
FE11111110254−2
FF11111111255−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進数の実物を読み、それぞれ何を表しているのかが分かります。

1

カラーコード

#ff8800。2桁ずつ赤・緑・青の強さ(0〜255)。

CSS・デザインツール

2

文字コード

「あ」は U+3042、UTF-8 では E3 81 82。

文字化けの調査

3

MACアドレス

02:42:ac:11:00:02。1バイトずつ6つ。

ネットワーク機器

4

メモリアドレス

0x7ffeec94d7a0。変数の置き場所の番号。

デバッグ

カラーコード(#ff8800)

CSS のカラーコード #RRGGBB は、赤(RR)・緑(GG)・青(BB)の強さを、それぞれ2桁の16進数(00〜FF=0〜255)で書いたものです。#ff8800 は、赤 ff=255、緑 88=136、青 00=0 のオレンジです。Chromium で色を指定し、ブラウザが計算した値(getComputedStyle)を読みました。

指定した値 Chromium が計算した色 読み方
#ff8800rgb(255, 136, 0)RRGGBB
#FF8800rgb(255, 136, 0)大文字でも同じ
#f80rgb(255, 136, 0)3桁は各桁を2つ重ねる(f→ff、8→88)
#ff880080rgba(255, 136, 0, 0.5)最後の2桁が不透明度(80=128)
#f808rgba(255, 136, 0, 0.533)4桁は #RGBA(8→88=136)
#ff88rgba(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
AU+00414100 4141
éU+00E9C3 A900 E9―
あU+3042E3 81 8230 4282 A0
漢U+6F22E6 BC A26F 228A BF
€U+20ACE2 82 AC20 AC―
😀U+1F600F0 9F 98 80D8 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(自動で付いた)011010100=1台あて(ユニキャスト)1=ローカルで決めた番号
02:42:ac:11:00:02(手で設定)000000100=ユニキャスト1=ローカルで決めた番号
ff:ff:ff:ff:ff:ff111111111=全員あて(ブロードキャスト)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.8SyntaxError: invalid syntax16進数の小数は書けない。float.fromhex("0x0.8p0") を使う
Python (256).to_bytes(1, "big")OverflowError: int too big to convert1バイトは255まで。バイト数を増やす
JavaScript parseInt("ff")NaN基数の指定忘れ。parseInt("ff", 16)
Java Integer.parseInt("ffffffff", 16)java.lang.NumberFormatException: For input string: "ffffffff" under radix 16int の上限超え。parseUnsignedInt か Long.parseLong
Java Integer.parseInt("0xff", 16)java.lang.NumberFormatException: For input string: "0xff" under radix 160x は読めない。外すか Integer.decode
bash echo $((16#1G))16#1G: value too great for base (error token is "16#1G")G は16進数の数字でない
bash printf "%d\n" ffprintf: ff: invalid number(と 0 を出力)0x を付けて 0xff
bc ibase=16; ff0(エラーにならない)大文字で 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・DEC2HEX10文字(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進数 文字
000000000000NUL
101000000011制御文字
202000000102制御文字
303000000113制御文字
404000001004制御文字
505000001015制御文字
606000001106制御文字
707000001117制御文字
8080000100010制御文字
9090000100111TAB(タブ)
100A0000101012LF(改行)
110B0000101113制御文字
120C0000110014制御文字
130D0000110115CR(復帰)
140E0000111016制御文字
150F0000111117制御文字
16100001000020制御文字
17110001000121制御文字
18120001001022制御文字
19130001001123制御文字
20140001010024制御文字
21150001010125制御文字
22160001011026制御文字
23170001011127制御文字
24180001100030制御文字
25190001100131制御文字
261A0001101032制御文字
271B0001101133ESC
281C0001110034制御文字
291D0001110135制御文字
301E0001111036制御文字
311F0001111137制御文字
32200010000040(空白)
33210010000141!
34220010001042"
35230010001143#
36240010010044$
37250010010145%
38260010011046&
39270010011147'
40280010100050(
41290010100151)
422A0010101052*
432B0010101153+
442C0010110054,
452D0010110155-
462E0010111056.
472F0010111157/
483000110000600
493100110001611
503200110010622
513300110011633
523400110100644
533500110101655
543600110110666
553700110111677
563800111000708
573900111001719
583A0011101072:
593B0011101173;
603C0011110074<
613D0011110175=
623E0011111076>
633F0011111177?
644001000000100@
654101000001101A
664201000010102B
674301000011103C
684401000100104D
694501000101105E
704601000110106F
714701000111107G
724801001000110H
734901001001111I
744A01001010112J
754B01001011113K
764C01001100114L
774D01001101115M
784E01001110116N
794F01001111117O
805001010000120P
815101010001121Q
825201010010122R
835301010011123S
845401010100124T
855501010101125U
865601010110126V
875701010111127W
885801011000130X
895901011001131Y
905A01011010132Z
915B01011011133[
925C01011100134\
935D01011101135]
945E01011110136^
955F01011111137_
966001100000140`
976101100001141a
986201100010142b
996301100011143c
1006401100100144d
1016501100101145e
1026601100110146f
1036701100111147g
1046801101000150h
1056901101001151i
1066A01101010152j
1076B01101011153k
1086C01101100154l
1096D01101101155m
1106E01101110156n
1116F01101111157o
1127001110000160p
1137101110001161q
1147201110010162r
1157301110011163s
1167401110100164t
1177501110101165u
1187601110110166v
1197701110111167w
1207801111000170x
1217901111001171y
1227A01111010172z
1237B01111011173{
1247C01111100174|
1257D01111101175}
1267E01111110176~
1277F01111111177DEL
1288010000000200-
1298110000001201-
1308210000010202-
1318310000011203-
1328410000100204-
1338510000101205-
1348610000110206-
1358710000111207-
1368810001000210-
1378910001001211-
1388A10001010212-
1398B10001011213-
1408C10001100214-
1418D10001101215-
1428E10001110216-
1438F10001111217-
1449010010000220-
1459110010001221-
1469210010010222-
1479310010011223-
1489410010100224-
1499510010101225-
1509610010110226-
1519710010111227-
1529810011000230-
1539910011001231-
1549A10011010232-
1559B10011011233-
1569C10011100234-
1579D10011101235-
1589E10011110236-
1599F10011111237-
160A010100000240-
161A110100001241-
162A210100010242-
163A310100011243-
164A410100100244-
165A510100101245-
166A610100110246-
167A710100111247-
168A810101000250-
169A910101001251-
170AA10101010252-
171AB10101011253-
172AC10101100254-
173AD10101101255-
174AE10101110256-
175AF10101111257-
176B010110000260-
177B110110001261-
178B210110010262-
179B310110011263-
180B410110100264-
181B510110101265-
182B610110110266-
183B710110111267-
184B810111000270-
185B910111001271-
186BA10111010272-
187BB10111011273-
188BC10111100274-
189BD10111101275-
190BE10111110276-
191BF10111111277-
192C011000000300-
193C111000001301-
194C211000010302-
195C311000011303-
196C411000100304-
197C511000101305-
198C611000110306-
199C711000111307-
200C811001000310-
201C911001001311-
202CA11001010312-
203CB11001011313-
204CC11001100314-
205CD11001101315-
206CE11001110316-
207CF11001111317-
208D011010000320-
209D111010001321-
210D211010010322-
211D311010011323-
212D411010100324-
213D511010101325-
214D611010110326-
215D711010111327-
216D811011000330-
217D911011001331-
218DA11011010332-
219DB11011011333-
220DC11011100334-
221DD11011101335-
222DE11011110336-
223DF11011111337-
224E011100000340-
225E111100001341-
226E211100010342-
227E311100011343-
228E411100100344-
229E511100101345-
230E611100110346-
231E711100111347-
232E811101000350-
233E911101001351-
234EA11101010352-
235EB11101011353-
236EC11101100354-
237ED11101101355-
238EE11101110356-
239EF11101111357-
240F011110000360-
241F111110001361-
242F211110010362-
243F311110011363-
244F411110100364-
245F511110101365-
246F611110110366-
247F711110111367-
248F811111000370-
249F911111001371-
250FA11111010372-
251FB11111011373-
252FC11111100374-
253FD11111101375-
254FE11111110376-
255FF11111111377-

よくある質問

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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?