Pitarit

仕事・勉強

進数変換

2進数・8進数・10進数・16進数をかんたん相互変換。どれかひとつ入力するだけで残り3つを即座に表示します。

計算フォームを読み込んでいます

進数変換早見表

0〜16 までは1つずつ、それ以降はプログラミングで実際によく目にする区切りの値だけを並べています。 2進数はツール本体と同じく4桁ごとに区切って表示しました。

10進数と2進数・8進数・16進数の対応表
10進2進8進16進
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
160001 00002010
200001 01002414
310001 1111371F
320010 00004020
630011 1111773F
640100 000010040
1000110 010014464
1270111 11111777F
1281000 000020080
2551111 1111377FF
2560001 0000 0000400100
5120010 0000 00001000200
1,0000011 1110 100017503E8
1,0240100 0000 00002000400
4,0960001 0000 0000 0000100001000
65,5351111 1111 1111 1111177777FFFF

15・255・4095・65535 のように「すべての桁が F になる値」は、そのビット幅で表せる最大値です。 逆に 16・256・4096・65536 は桁が1つ増える境目で、16進数では 10・100・1000・10000 とキリの良い形になります。

2進数の位取り(ビットの重み)

10進数が右から 1・10・100 と10倍ずつ増えるのに対し、2進数は右から1・2・4・8 と2倍ずつ増えていきます。この「重み」さえ覚えていれば、2進数を10進数に戻すのは 1が立っているビットの重みを足すだけの作業です。たとえば 1101 は 8+4+1 で 13 になります。

2進数のビット位置ごとの重み
ビット位置累乗重み(10進)16進
第0ビット2^011
第1ビット2^122
第2ビット2^244
第3ビット2^388
第4ビット2^41610
第5ビット2^53220
第6ビット2^66440
第7ビット2^712880
第8ビット2^8256100
第9ビット2^9512200
第10ビット2^101,024400
第11ビット2^112,048800
第12ビット2^124,0961000
第13ビット2^138,1922000
第14ビット2^1416,3844000
第15ビット2^1532,7688000

逆向きの変換、つまり10進数から2進数を求めるときは、2で割った余りを記録しながら商が0になるまで割り続け、 最後に余りを下から読みます。13 であれば 13÷2=6余り1、6÷2=3余り0、3÷2=1余り1、1÷2=0余り1 となり、 下から並べて 1101 です。

ビット数と表せる値の範囲

n ビットで表せる値の個数は 2 の n 乗、符号なし整数としての最大値はそこから1を引いた値です。 「8ビットだから最大255」「16ビットだから最大65535」という数字は、この式から出てきています。

ビット数ごとに表せる値の個数と最大値
ビット数表せる個数符号なし最大値よく使われる場面
1 ビット21真偽値(0か1か)
4 ビット161516進数1桁(ニブル)
8 ビット2562551バイト。RGBの1色、IPv4の1オクテット
10 ビット1,0241,0231KiB = 2^10 バイト
16 ビット65,53665,535TCP/UDPのポート番号、Unicodeの基本多言語面
24 ビット16,777,21616,777,215フルカラー(RGB各8ビット)
32 ビット4,294,967,2964,294,967,295IPv4アドレス、32ビット整数
64 ビット18,446,744,073,709,551,61618,446,744,073,709,551,61564ビット整数、メモリアドレス

符号付き整数の場合は最上位ビットを正負の符号に使うため、範囲は −2^(n−1) 〜 2^(n−1)−1 になります。 8ビットなら −128〜127、32ビットなら −2,147,483,648〜2,147,483,647 です。 なお、このツールが扱えるのは 0 以上かつ 2^53−1 までの整数です。

16進数がカラーコードに使われる理由

16進数が便利なのは、1桁がちょうど2進数4桁に対応するからです。2進数と16進数の変換は4桁ずつ区切って読み替えるだけで済み、10進数のように筆算が要りません。 そして16進数2桁=2進数8桁=1バイトなので、バイト単位で扱うデータは16進数で書くと桁が揃います。

HTMLやCSSのカラーコード #RRGGBB はまさにこれで、赤・緑・青それぞれの明るさを1バイト(00〜FF、10進で0〜255)で表し、 3色ぶんを6桁に並べたものです。

代表的なカラーコードと対応するRGB値
カラーコード色RGB
#FF0000赤(red)25500
#00FF00緑(lime)02550
#0000FF青(blue)00255
#FFFF00黄(yellow)2552550
#FFA500オレンジ(orange)2551650
#00FFFF水色(aqua)0255255
#FF00FFマゼンタ(fuchsia)2550255
#808080グレー(gray)128128128
#FFFFFF白(white)255255255
#000000黒(black)000

#808080 のようにR・G・Bが同じ値だと無彩色(グレー)になり、値が大きいほど明るくなります。 3桁の省略記法(#F00)は各桁を2回繰り返した #FF0000 と同じ意味です。

8進数とファイルパーミッション

8進数は1桁がちょうど2進数3桁に対応します。Linux や macOS のファイル権限がchmod 755 のように3桁の8進数で書かれるのは、読み取り・書き込み・実行という3つの権限が ちょうど3ビットに収まるからです。3桁はそれぞれ左から所有者・グループ・その他のユーザーを表します。

8進数1桁とファイルパーミッションの対応
8進1桁2進3桁記号意味
0000---権限なし
1001--x実行のみ
2010-w-書き込みのみ
3011-wx書き込みと実行
4100r--読み取りのみ
5101r-x読み取りと実行
6110rw-読み取りと書き込み
7111rwx読み取り・書き込み・実行すべて

755 は「所有者はすべて可、グループとその他は読み取りと実行のみ」という意味になります。 644 なら「所有者は読み書き、ほかは読み取りのみ」で、これはテキストファイルの一般的な権限です。

よくある質問

10進数の255は2進数・16進数でどう表しますか?
255(10進数) = 1111 1111(2進数) = FF(16進数)です。255はコンピュータ(8ビット・1バイト)で表せる最大の整数で、RGBカラーの各色の最大値(255, 255, 255 = 白)としてよく使われます。
16進数の「FF」とは何ですか?
FFは16進数で「15×16+15 = 255」を意味します。コンピュータのプログラムでは0xFF と表記することが多く、HTMLカラーコード(#FFFFFF = 白)やメモリアドレスにも使われます。
2進数で4桁ごとにスペースが入るのはなぜ?
4ビットで1ニブル(16進数1桁)に対応するため、4桁ごとに区切ると読みやすく、16進数との対応も直感的に分かります。
16進数の大文字・小文字はどちらが正しい?
どちらも正しい表記です。プログラムのソースコードではスタイルによって使い分けます。CSSカラーコードは小文字(#ff0000)、Windowsのファイルシステムや一部の規格は大文字(0xFF)を使うことが多いです。
なぜコンピュータは2進数を使うの?
電気回路の「オン(1)」と「オフ(0)」の2状態で数値を表すのが物理的に最もシンプルで信頼性が高いためです。8進数や16進数は2進数を人間が読みやすいようにまとめた表記です。
IPアドレスの「192.168.0.1」は2進数でどう表しますか?
192 = 1100 0000、168 = 1010 1000、0 = 0000 0000、1 = 0000 0001 です。IPアドレスは4オクテット(各8ビット)で構成されます。サブネットマスク(255.255.255.0)も同様に2進数で理解するとネットワーク設計がわかりやすくなります。
8進数はどんな場面で使いますか?
Linux/Unixのファイルパーミッション(chmod 755 など)で使われます。7 = 111(2進数) = 読み取り・書き込み・実行すべて許可、5 = 101 = 読み取りと実行のみ許可を意味します。
プログラミングで16進数を使う理由は?
メモリアドレス・カラーコード(#FF5733)・フラグビット(0x01, 0x02, 0x04...)など、2進数との相互変換が簡単なため広く使われます。16進数1桁は必ず2進数4桁(ニブル)に対応するため、視認性が高いです。
10進数を手計算で2進数に変換するには?
2で割った余りを記録しながら商が0になるまで割り続け、最後に余りを下から順に並べます。13なら 13÷2=6余り1、6÷2=3余り0、3÷2=1余り1、1÷2=0余り1 で、下から読んで 1101 です。
2進数を手計算で10進数に戻すには?
1が立っているビットの重み(1, 2, 4, 8, 16…)を足すだけです。1101 なら 8+4+0+1 = 13 になります。ビットの重みは右端から 2の0乗、2の1乗…と2倍ずつ増えていきます。
0xや0bというプレフィックスは何ですか?
数値がどの進数で書かれているかを示す接頭辞です。多くのプログラミング言語で 0x が16進数、0b が2進数、0o が8進数を表します。接頭辞が無い数値は10進数として扱われます。