16進数変換

16進数と10進数・2進数・8進数を、その場で相互に変換する道具です。負の数は2の補数 (ビット幅を選択)、小数点つきの数も扱え、循環小数は()で厳密に示します。割り算の筆算、小数部の計算、2の補数の手順、位の重みといった計算の途中も見られます。値はブラウザの中だけで計算し、送信しません。

文 ゆめさく公開 更新

16進数
2進数
8進数
10進数
符号の扱い

符号なしでは負の数を扱えません (小数部は扱えます)。負の数を使うときはここを2の補数に切り替えてください (2の補数は整数だけです)。

表示
計算の途中を見る (10進数 と 16進数 の間)

10進数 255 を 16進数 に直す筆算です。16 で割り続け、商が 0 になるまでの余りを、下から上へ読むと答えになります。

割られる数÷ 16商余り (下から読む)
255÷ 1615F
15÷ 160F

16進数 FF を10進数に直す、位の重みの内訳です。各桁の値に、その桁の重み (16 の累乗) を掛けて、全部を足し合わせます。

桁重み (16^n)桁 × 重み
F16^1 = 16240
F16^0 = 115

合計 255

使い方

  1. 変換したい数を、10進数・2進数・8進数・16進数のどれか1つの欄に入力します。残り3つの欄が自動で計算されます。
  2. 負の数や特定のビット幅で考えたいときは「符号の扱い」を2の補数に切り替え、ビット幅を選びます。
  3. なぜその答えになるかを確かめたいときは「計算の途中を見る」を開き、割り算の筆算・小数部の計算・2の補数の手順・位の重みの内訳を読みます。
  4. 値の右の「コピー」でプログラムや資料にそのまま貼り付けられます。

この16進数変換のしくみ

この道具は、16進数を先頭に、10進数・2進数・8進数・16進数の4つの欄を常に並べ、最後に編集した欄から残り3つを計算し直します。整数部はBigIntで持つので、JavaScript の通常の数値 (Number) で安全に扱える桁数を超えても、正確な値のまま変換できます。

整数部は割り算の繰り返しで求める

10進数を16進数にするときは、16で割った余りを集め、商が0になるまで割り続けます。得られた余りを、最後に求めたものから順に並べると16進数になります。「計算の途中を見る」では、入力した値でこの割り算を実際に行った表をそのまま出します。

小数部は分数のまま計算し、循環を検出する

多くの電卓やツールは小数部を浮動小数点で近似するため、基数を変えるたびに誤差が乗ります。この道具は、入力した小数部を「分子 ÷ 基数の桁数乗」という分数のまま持ち、16を掛けては整数部を取り出す操作を繰り返します。割り切れれば厳密な値になり、同じ余りに戻ってくれば、そこから先が無限に繰り返す循環小数だと分かるので、繰り返す部分を()で囲んで示します。この()の表記は、表示するだけでなく入力としても厳密な分数として読み直すので、循環小数が出ている欄を次に押して別の基数へ移しても、値が変わりません。

負の数は2の補数で、ビット幅を決めて扱う

MDN Web Docs のNumber.prototype.toString()のページは、radixに2を指定しても、負の数は2の補数ではなく符号付きの文字列になると明記しています。Python のint.to_bytes()も、signed引数を立てたときだけ2の補数で表すとしています。つまり、負の数を2の補数のビット列として見たいときは、ビット幅を自分で決めて別に計算する必要があります。この道具の「符号の扱い」を2の補数に切り替えると、ビット幅 (8/16/32/64) を選んだうえで、その幅の2の補数として相互に変換します。

2進数4桁と16進数1桁の対応

16進数は16種類の値を1桁で表すので、2進数のちょうど4桁 (0000から1111) と1対1で対応します。この対応があるので、2進数を16進数にするときは、下の桁から4桁ずつ区切って読み替えるだけで済み、16で割る計算をする必要がありません。

0〜15 の対応表
10進数16進数2進数 (4桁)8進数
0000000
1100011
2200102
3300113
4401004
5501015
6601106
7701117
88100010
99100111
10A101012
11B101113
12C110014
13D110115
14E111016
15F111117
0〜255 の一覧を開く
0=001=012=023=034=045=056=067=078=089=0910=0A11=0B12=0C13=0D14=0E15=0F16=1017=1118=1219=1320=1421=1522=1623=1724=1825=1926=1A27=1B28=1C29=1D30=1E31=1F32=2033=2134=2235=2336=2437=2538=2639=2740=2841=2942=2A43=2B44=2C45=2D46=2E47=2F48=3049=3150=3251=3352=3453=3554=3655=3756=3857=3958=3A59=3B60=3C61=3D62=3E63=3F64=4065=4166=4267=4368=4469=4570=4671=4772=4873=4974=4A75=4B76=4C77=4D78=4E79=4F80=5081=5182=5283=5384=5485=5586=5687=5788=5889=5990=5A91=5B92=5C93=5D94=5E95=5F96=6097=6198=6299=63100=64101=65102=66103=67104=68105=69106=6A107=6B108=6C109=6D110=6E111=6F112=70113=71114=72115=73116=74117=75118=76119=77120=78121=79122=7A123=7B124=7C125=7D126=7E127=7F128=80129=81130=82131=83132=84133=85134=86135=87136=88137=89138=8A139=8B140=8C141=8D142=8E143=8F144=90145=91146=92147=93148=94149=95150=96151=97152=98153=99154=9A155=9B156=9C157=9D158=9E159=9F160=A0161=A1162=A2163=A3164=A4165=A5166=A6167=A7168=A8169=A9170=AA171=AB172=AC173=AD174=AE175=AF176=B0177=B1178=B2179=B3180=B4181=B5182=B6183=B7184=B8185=B9186=BA187=BB188=BC189=BD190=BE191=BF192=C0193=C1194=C2195=C3196=C4197=C5198=C6199=C7200=C8201=C9202=CA203=CB204=CC205=CD206=CE207=CF208=D0209=D1210=D2211=D3212=D4213=D5214=D6215=D7216=D8217=D9218=DA219=DB220=DC221=DD222=DE223=DF224=E0225=E1226=E2227=E3228=E4229=E5230=E6231=E7232=E8233=E9234=EA235=EB236=EC237=ED238=EE239=EF240=F0241=F1242=F2243=F3244=F4245=F5246=F6247=F7248=F8249=F9250=FA251=FB252=FC253=FD254=FE255=FF

2の補数の求め方

ビット幅をwとすると、負の数xの2の補数のビット列は、次の式で求められます。

ビット列 = 2^w + x (xが負のとき)

たとえば8ビットで-1を考えると、2^8 + (-1) = 255で、16進数のFF、2進数の11111111です。逆に、ビット列の最上位ビット (符号ビット) が1のときは、ビット列から2^wを引くと元の符号つきの値に戻ります。

8ビットの2の補数の例
10進数2進数 (8ビット)16進数 (8ビット)
00000000000
10000000101
127011111117F
-111111111FF
-211111110FE
-1281000000080

8ビットの2の補数で表せる範囲は-128から127までです。この範囲を超える値を2の補数欄に入れると、この道具はビット幅を増やすよう案内します。

コードで書くなら

実際に動かして確かめたPythonとJavaScriptの例です。どちらも、この道具と同じ考え方 (BigIntや2の補数の式) を使っています。

hex_convert.py

# 10進数 -> 16進数、16進数 -> 10進数
n = 255
hex_text = hex(n)
int_value = int("ff", 16)
print(hex_text)    # '0xff'
print(int_value)   # 255

# 2の補数 (8ビット) で -1 を16進数にする
width = 8
value = -1
bits = value & ((1 << width) - 1)
text = f"{bits:0{width // 4}x}"
print(text)  # 'ff'

hex-convert.js

// 10進数 -> 16進数、16進数 -> 10進数
const n = 255;
const hexText = n.toString(16);
const intValue = parseInt("ff", 16);
console.log(hexText);  // 'ff'
console.log(intValue); // 255

// BigInt なら 0x リテラルをそのまま読める
const big = BigInt("0xff").toString(2);
console.log(big); // '11111111'

// 2の補数 (8ビット) で -1 を16進数にする
const width = 8n;
const value = -1n;
const bits = value & ((1n << width) - 1n);
console.log(bits.toString(16)); // 'ff'

よくある間違い

ゆめさくのCS理論編「16 進数から 10 進数への変換」(cs-hex-conversion、2026-⁠10-⁠26 時点の確認テストから引用) が挙げる間違いです。

  • 各桁の数字をそのまま足してしまい、桁の重みを無視する間違いです。16進数の2Dを10進数にするとき、2+13=15とするのは誤りで、正しくは2×16 + 13×1 = 45です。
  • 16進数の重み (16の累乗) を、10進数の感覚で重み10と取り違える間違いです。
  • 桁の順番を逆に数え、1の位と16の位を入れ替えてしまう間違いです。
  • parseInt("08", 8)のように、その基数で使えない桁 (8進数の8や9) を含めると、言語によっては途中までしか読まずに別の値になります。この道具は、使えない文字が1つでもあるとエラーで知らせ、黙って途中までの値を返すことはしません。
  • 2の補数のビット列を、符号つきの10進数だと思って桁ごとに読み替えてしまう間違いです。ビット列の最上位ビットが1なら、2^wを引く計算が別に必要です。

よくある質問

16進数変換とは、何をする道具ですか

10進数・2進数・8進数・16進数のどれかに数を入れると、残り3つの基数の値をその場で計算して並べる道具です。値はこのブラウザの中だけで計算し、どこにも送りません。負の数は2の補数 (ビット幅を選べます)、小数点つきの数も扱え、循環小数は()で厳密に示します。変換の途中 (割り算の筆算、小数部の計算、2の補数の手順、位の重み) も見られます。

16進数とは何ですか

0から9の数字と、10から15を表すA(10)からF(15)までの英字で、16種類の値を1桁に収める記数法です。2進数4桁 (0000から1111) がちょうど16進数1桁に対応するので、2進数を4桁ずつ区切って読み替えるだけで16進数に変換できます。たとえば2進数の1111 1111は、4桁ずつに分けるとFFです。

16進数はどのような場面で使われますか

色の指定 (#RRGGBBのように赤・緑・青を16進数2桁ずつで表すカラーコード)、メモリアドレスやポインタの値、MACアドレス、MD5やSHA-⁠256などハッシュ値の表記、通信やファイルのバイトダンプなど、2進数をそのまま書くと長すぎる場面で使われます。16進数1桁が2進数4桁 (半バイト) にきっちり対応するため、バイト単位のデータと相性がよいことが理由です。

FF は 10進数でいくつですか

255です。16進数のFFは、上の桁のF (15) に重み16を、下の桁のF (15) に重み1を掛けて、15×16 + 15×1 = 255と計算します。1バイト (8ビット) で表せる符号なしの値の最大がFF=255で、00から数えてちょうど256通りです。

16進数と10進数はどう変換しますか

10進数から16進数へは、16で割り続けて余りを集め、最後に求めた商から順に (下から上へ) 余りを並べます。16進数から10進数へは、各桁の値に桁の重み (16の累乗) を掛けて全部を足します。この頁の道具は、入力した値でこの2つの手順を実際に計算し、「計算の途中を見る」から割り算の筆算と位の重みの内訳をそのまま表示します。

16進数の小数点以下はどう変換しますか

小数部は浮動小数点を使わず、入力した桁を「分子 ÷ 基数の桁数乗」の分数として正確に扱い、16を掛けて整数部を取り出す操作を繰り返して求めます。割り切れれば厳密な値、割り切れずに同じ余りへ戻れば、そこから循環することを検出し、繰り返す部分を()で囲んで示します。たとえば10進数の0.1は16進数で0.1(9)(9が無限に繰り返す)になります。循環小数の()の形のまま、この頁のどの欄に打ち込んでも、厳密な値として正しく読み直します。

マイナスの16進数はどう表しますか

数式やプログラムの表記では、16進数にも-FFのように符号を付けて書けます (Pythonのhex(-255)は'-0xff'にします)。ただし、コンピューターの中で負の数をビットの並びだけで持つときは、符号の文字を使わず2の補数という形にします。ビット幅 (8/16/32/64) を決め、負の値なら2のビット幅乗を足した値を16進数にします。たとえば8ビットで-1は、256-⁠1=255で、16進数のFFです。この頁の「符号の扱い」を2の補数に切り替えると、10進数欄に負の数を入れられるようになります。

FF が -1 になるのはなぜですか

2の補数で負の数を表しているからです。8ビットの2の補数では、2^8=256を法にして負の数を数えます。-1は256+(-1)=255で、16進数のFFです。同じFFというビットの並びでも、符号なし (0以上の整数) で読めば255、符号あり (2の補数、8ビット) で読めば-1になります。どちらで読むかは、頁の「符号の扱い」とビット幅で決めます。

JavaScriptやPythonの16進数リテラルの0xは何を意味しますか

0xは「このあとは16進数で書く」という接頭辞です。MDN Web DocsのJavaScriptの字句文法は、0xまたは0Xに続けて0から9とAからFの文字が続く形を16進数リテラルと定めており、0b (2進数) と0o (8進数) も同じ仕組みで用意されています。この道具の16進数欄も、0xを付けたまま貼り付けると自動で外して読み取ります。「接頭辞 (0x・0b・0o) を付ける」を有効にすると、逆に出力にも付けられます。

文字列 (テキスト) を16進数にしたい時はどうしますか

文字は、まずUTF-⁠8などの符号化方式でバイト列に変換してから、各バイトを16進数2桁で表します。たとえば「あ」はUTF-⁠8でE3 81 82の3バイトになるので、16進数ではE38182です。この頁の道具は整数の基数変換に絞っているので、文字列を直接貼り付ける機能はありません。

この道具の計算は、通信や保存をしますか

しません。入力した値も計算結果も、このページを開いているブラウザの中だけで計算します。ブラウザの開発者ツールでNetworkの画面を開き、値を打っても通信の行が増えないことで確かめられます。

何桁くらいの大きな数まで変換できますか

整数部は4096桁まで受け付けます。JavaScriptの通常の数値 (Number) は、安全に扱える範囲 (Number.MAX_SAFE_INTEGERあたり) を超えると誤差が出ますが、この道具はBigIntを使っているので、その範囲を超える整数も正確に計算します (この道具自体は4096桁までという上限を付けています)。

16進数の桁区切りは、どこに入りますか

「桁区切りを入れる」を付けると、16進数は右から2桁ごと (1バイトごと) に空白で区切って表示します。10進数や8進数は3桁ごと、2進数は4桁 (1ニブル) ごとです。区切りはコピーすると取り除いた値になるので、プログラムにそのまま貼り付けられます。「0埋めでビット幅に桁をそろえる」を付けると、符号なしの値でも選んだビット幅ぶんの桁数まで0で埋めます。

基本情報技術者試験の対策にも使えますか

ゆめさくの基本情報技術者試験対策コースは、基数変換を「毎回のように出題される計算問題」の1つとして扱っています。この頁の下にある関連レッスンへのリンクから、CS理論編の「16 進数から 10 進数への変換」や、基本情報技術者(FE)対策の「基数と補数の計算」の回に進めます。

書き手と日付と出典

書き手
ゆめさく
公開日
更新日
  • MDN Web Docs Number.prototype.toString()

    MDN Web Docs の英語版 (2025年7月10日更新) ・ に本文を読んで確かめました

    radixに2から36までの整数を指定できること、10を超える桁にはaからzの文字を使うこと、数値が負のときは符号を保ったまま出力し、radixが2であっても2の補数ではなく符号付きの文字列になることが明記されていること。

  • MDN Web Docs BigInt

    MDN Web Docs の英語版 (2026年9月2日更新) ・ に本文を読んで確かめました

    BigIntはNumberの安全な範囲 (MAX_SAFE_INTEGERなど) を超えて表せない整数値を表すための型で、すべてのBigInt値は符号つきであることが書かれていること。「桁数に上限が無い」とは書かれていないので、本文ではその言い方をしていない。

  • MDN Web Docs JavaScript Lexical grammar (Numeric literals)

    MDN Web Docs の英語版 ・ に本文を読んで確かめました

    2進数リテラルは0bまたは0B、8進数リテラルは0oまたは0O、16進数リテラルは0xまたは0Xの接頭辞に続けて、それぞれの基数で使える文字が続く形と定められていること。BigIntリテラルは桁数に上限のない整数 (arbitrary precision) として扱われると書かれていること。

  • Python 3 ドキュメント int.to_bytes() / int.from_bytes()

    Python 3 の英語版 ・ に本文を読んで確かめました

    signed引数が、整数を2の補数で表すかどうかを決めること。signedがFalse (既定) で負の整数を渡すとOverflowErrorになることが書かれていること。

次の一歩

数の変換だけなら、ここまでで足ります。基数変換の考え方を基本情報技術者試験の過去問で確かめたい人、自分でアプリを作れるようになりたい人は、下から進んでください。

ツールの一覧へ戻る