\( \require{cancel} \)
earth
湘南理工学舎
[戻る]

2026/01/05
2024/10/03

 豆知識/数学

 2進数・16進数とコンピュータ


(binary number・heexadecimal and computer)
 --目 次--
  • ♦はじめに

  • ♦2 進 数
  • •2/10 進数の桁の重み
  • •ビットとバイト
  • •2/10 進数の桁上がり

  • ♦16 進 数
  • •16進数の桁の重み
  • •16進数の桁上がり

  • ♦2/10/16 進数の表示

    ♦2/16 進数とコンピュータ
  • •ビットパターン

  • ♦2進数の小数

    ♦例 題
  • •例題1
  • •例題2


  • はじめに


     コンピュータの原理は 2進数が基本ですが, プログラムでは16進数が多く使われます。
    これから10進数と比較しながら 2進数, 16進数について学んでいきましょう。
    コンピュータが苦手でも,ここで学んでコンピュータを身近に感じられることを期待します。
    2進数と16進数の "右の( )内" は10進数です。
    10進数はそのままの表記を基本にします。
    2進数を2進と簡易表記することがあります。10進,16進も同様です。(文章の流れでわかるはずです)

    桁の重みの概要(10進/2進/16進)


     数の各桁には桁の重みがあります, それを表したのが下図です。
    10進数の16を基に2進数16進数が書いてあります。
    コンピュータはトランジスターのON/OFF を数字の「1」/「0」としています。
    下図の10進の(16)の2桁を表すのに2進数では5桁を要します…2進数の欠点です。
    プログラムの原子言語/マシン語では16進が使われます。…16進は2進より桁数が少ない。
    プログラムは16進, そのプログラムを記憶するメモリは2進データです。
    桁の重み
    桁の重み
    10進の(16)は16進で(16)で桁上がりするので…「10」の2桁です。
    2進数は「\(16\sc{の桁}⇒2^4=16\)」だから下の4桁は全て0 です。

    さて2進から話していきましょう!

    2 進 数

    (Binary)
    ---2進の話は少し長くなるけど辛抱です---


    身近な10進数(Decimal) と比較しながら2進数を説明します

    2進数と10進数の桁の重み



    はじめに10進数を考えます
     
    10進数2桁
    "14" を例にします。
    "1 4" の "4" は1の桁(\(\cl{10^0}\)), その上の"1" は10の桁(\(\cl{10^1}\)) です。
     下の赤字 \(\cl{10^{□}}\) が桁の重みです
    \(\quad \underbrace{\phantom{0}1\phantom{0}}_{\cl{\l{10^1}}} \underbrace{\phantom{0}4\phantom{0}}_{\cl{\l{10^0}}}\)\(\ \sc{:❶}\)

    ∴ \( \sc{❶}=1\x \cl{10^1}+4\x \cl{10^0}\)\(=10+4=14\)

     
    2進数4桁(4bit)
    (14) を2進に変換
      (表1の2進4桁の項も参照して下さい)
    2進は"0" と "1" だけで数を表すので 10進と比べ 桁上りの頻度は多く, 桁数も増えます。
    10進の "14"2進では " \(\l{1110}\) " です。この変換は次の 桁の重み計算式 ❷ から求とまります。
    桁の重み(4桁): \( \s{\cl{2^3}=8},\ \cl{2^2}=4,\) \(\ \s{\cl{2^1}=2, \ \cl{2^0}=1}\)
    \( \underbrace{\phantom{0}1\phantom{0}}_{\ul{\cl{\l{2^3}}}} \underbrace{\phantom{0}1\phantom{0}}_{\cl{\l{2^2}}}\) \(\underbrace{\phantom{0}1\phantom{0}}_{\ul{\cl{\l{2^1}}}}\) \(\underbrace{\phantom{0}0\phantom{0}}_{\cl{\l{2^0}}}\)\(\ \sc{:❷}\)

    \(= 1\x \ul{\cl{2^3} }+1\x \cl{2^2}\) \(+ 1\x \ul{\cl{2^1}} +0 \x \cl{2^0} \)

    \(2^0\) だけ0です。 それ以上の桁は立っています。
    だから\(2^1, 2^2, 2^3\) の桁の重みを 加算 するだけです。

    \(=8+4+2+0=14\)

    ビット(bit)とバイト(byte)とは


    1ビットとは2進数の1桁を表す。(※1)
    ・表1は2進数の4bitを表している。
    ・ 4bitに4bitを加えると8bit (8桁)になる。
    ・この8bit1バイト という。(2進数の8桁のこと)
     【8bitの表の参考先】
    ・2バイト とは 16bit のことで 2進数の16桁です。
    注(※1): 1bitはコンピュータが扱う最小単位でもある

    表1は10進の 0~15 を 2進(4桁(4bit)), 16進(後述)で表したものです。
    2進の4桁の最大数1111 は10進の (15) です。
    10進の増加に対する2進の桁上がりに注目すれば 2進が分るはずです。
    【表1】 2進4桁(4bit)と10進,16進
    \(\begin{array}{cccc|c|c} \hline \s{2} &\s{進} &\s{数} & &\s{10進}&\sc{16進} \\ \hline \sc{4桁} &\sc{3桁} &\sc{2桁} &\sc{1桁}&\sc{2桁}&\sc{1桁} \\ \hline 0 &0 &0 &0 &0 &0\\ 0 &0 &0 &1 &1 &1\\ 0 &0 &1 &0 &2 &2\\ 0 &0 &1 &1 &3 &3\\ 0 &1 &0 &0 &4 &4\\ 0 &1 &0 &1 &5 &5\\ 0 &1 &1 &0 &6 &6\\ 0 &1 &1 &1 &7 &7\\ 1 &0 &0 &0 &8 &8\\ 1 &0 &0 &1 &9 &9\\ 1 &0 &1 &0 &10 &A\\ 1 &0 &1 &1 &11 &B\\ 1 &1 &0 &0 &12 &C\\ 1 &1 &0 &1 &13 &D\\ 1 &1 &1 &0 &14 &E\\ 1 &1 &1 &1 &15&F\\ \hline \end{array} \)
    この表(4bit)の続きは表4(8bit)です。

    次は桁上がりです

    2進数と10進数の桁上がり



     
    10進数の桁上がり

     10進は「 100←99 , 10←9 」のときが桁上がりです。
    \( \ul{100\ \sc{\nwarrow} 99} ,\ 98,\ 97 \dots \ul{ 10\ \sc{\nwarrow} 9} ,\ 8,\ 7 \dots \)
    10進数についての説明はいらないですね。

     
    2進数の桁上がり

     2進の数の増え方は:( ()内は10進)
    1111(15)←…1000(8)←111(7)… ←100(4)← 11(3)← 10(2)← 01(1) ←00(0)
    2進数の桁上がりは:
    下記は「2進数(10進数)」である。
    \(\ul{ \cl{1\ 000} \sc{(8)}\ \sc{\nwarrow} \cl{111}\sc{(7)} }\) \(\ \ul{ \cl{1\ 00} \sc{(4)}\ \sc{\nwarrow} \cl{11}\sc{(3)} }\) \(\ \ul{ \cl{1\ 0} \sc{(2)}\ \sc{\nwarrow} \cl{01}\sc{(1)} }\)
    2進の桁上がりは頻繁におこり, また桁数も大変多くなります。
    …2進数は以上です。


    これから16進数を学びます
    今度は逆に10進より桁上がりは少なく、桁数も少なくなります。

    16 進 数

    (Hexadecimal)
    " 16進は "1~9" までは10進と同じ, "10~15" まではアルファベット "A~F" に対応します。
    \(\s{F_{(15)}}\)の上は, 桁上がりして\(\s{10_{(16)}}\)のなります。
    【表2】16進と10進
    \( \begin{array}{c|ccccccc} \hline 16進& \cl{10}& \cl{\s{F}}& \cl{\s{E}}& \cl{\s{D}}& \cl{\s{C}}& \cl{\s{B}}& \cl{\s{A}}& 9\cdots& 2& 1 \\ \hline 10進& 16& 15& 14& 13& 12& 11& 10& 9 \cdots& 2& 1\\ \hline \end{array} \)
    これから「16進数には末尾に"h"」を, 「2進数には末尾に"b"」 をつけて表示します。

    なぜ, 16進がコンピュータのプログラムに使われるのか…


    まずは, 2進4桁(bit)と16進の1桁の各数が1対1の対応をしているからです。
    ☆2進4桁の最大\(1111b\)(15)は 16進1桁の最大\(Fh\)(15)と同じである。
    桁上がりのタイミングが同じ, 10進の15→16 のとき, 2進数と16進が同時に桁上がりする。
    ☆2進 : \(\ul{1}0000b\ \sc{\nwarrow} \ 1111b\)
    ☆16進: \(\ul{1}0h\ \sc{\nwarrow} Fh \)
    2進の8桁(bit)が16進なら2桁で済み, 見やすく合理的。
    ☆\(1111 1111b=FFh_{(255)}\)

    16進数の桁の重み


    \( \underbrace{\phantom{0}F\phantom{0}}_{\cl{\s{16^1}}} \underbrace{\phantom{0}F\phantom{0}}_{\cl{\s{16^0}}}\)\(\ \sc{:❸}\)
    \(\s{=15\x 16^1+15\x16^0=240+15=}255\)
    1から数えて255です, 0から数えると256です。
    "255" に"0" の数を加えると "256"「ニゴロ」となり, 1バイト分のデータ量(情報量)になる。
    256 通りの情報を識別でできる, これをビットパターンという。
    ビットパターンは "0"と"1" の組合せのことで, ビットパターン数\(P_n\)は:
     \(P_n=2^n\)\(\quad :\small{❹}\) (nはビット数)
    4ビットなら\(P_n=2^4=16\) (順列計算)です。

    16進数の桁上がり


    次のとき桁上がりする。
    \(\ul{ \cl{100h}\sc{(256)}\ \sc{\nwarrow} \cl{FFh}\sc{(255)} }\) \(\ul{ \cl{10h}\sc{(16)}\ \sc{\nwarrow} \cl{Fh}\sc{(15)} }\)

    2進,10進,16進数の表示


    必要に応じて 2進・10進・16進数を次のように表記します。
     
    10進数の表示:

    "20" の横の添え字が 10進 を示している。
    20 \(\st{d}\), または \(20\sc{(10)}\)
    \(\st{d}\)の語源は "decimal number"
    ここではデフォルトとして10進数をそのまま表記します。

     
    2進数の表示:

    "100" の横の添え字が 2進 を示している。
    \(\quad \ul{100\st{b}}\), \(\ \ul{100\sc{(2)}},\ \ul{(100)_{2}}\)
    \(\st{b}\)の語源は "binary number"

     
    16進数の表示:

    16進数の場合は分野により表示方法が様々あります
    (この裏を返せば, コンピュータでは16進が主流ということですね)
    数学, その他一般 では以下が多い:
    \( \ul{ 10\st{h} }\) (16d), \( \ul{ \s{\cl{0}FF} \st{h} } \)(255d)
     英字で始まるときは「\(\cl{0}\)」をつける
     \(\st{h}\)の語源は "hexadecimal"。
    ソフトウェアの分野 ではもっと 表示方が増える。
    "0FFh=255" を例にすると:
    「0FFh」: アセンブリ言語,その他
    &#x FF」: html,xml(Web用)
    0x FF」 : C言語
    &h FF」: basic(マイクロソフト)
    ¥x FF」: C++, Java
    $ FF」: basic(マイクロソフト以外の)

    2進数,16進数とコンピュータ

    さて以下は2進の「上4bit」「下4bit」の桁の重みです。
    (上記では「下4bit」だけでした)
    【表3】2進数8bitの桁の重み
    上4 bit 下4 bit
    \( \begin{array}{c|cccc|cccc} \hline \sc{2進桁重み}& 2^7& 2^6& 2^5& 2^4& 2^3& 2^2& 2^1& 2^0\\ \hline \sc{10進}& 128& 64& 32& 16& 8& 4& 2& 1\\ \hline \end{array} \)
    下4bit:\(\ \small{2^3=8}\)\(,\ \small{2^2=4}\) \(, \ \small{2^1=2}\) \(,\ \small{2^0=1}\)
    上4bit:\(\ \small{2^7=128}\)\(,\ \small{2^6=64}\) \(, \ \small{2^5=32}\) \(,\ \small{2^4=16}\)
    これで 以下の表 が理解できる準備ができました。
    下表は0~255までを2進数と16進数で表しています。
    255 は2進/16進では 1111 1111\(\st{b}\) / 0FF\(\st{h}\) の 8bit のデータ数を示します。
    マイコンでは0 も情報です, 従い8bitの情報量は 256(=255+1)通りです。
    すなわち8ビットのビットパターン数は 256 です。
    (ビットパターン数は式❹ の\(P_n=2^8=256\)と同じです。)
    8bit を1byte(バイト) と言います。

    次に8ビットのビットパターンに対応する10進と16進の表示を見てみよう。
    8ビットのビットパターン数は "256" です。

    ビットパターン


    【表4】8ビットのビットパターン
    \(\begin{eqnarray} \p{0} \p{0}& 上\ 4\ bit\p{0} \p{0}&\p{0}& 下\ 4\ bit& & & \sc{=}10進&\sc{=}16進 \end{eqnarray} \)

    \(\begin{eqnarray} 2^7&\ 2^6&\ 2^5&\ 2^4& \ & 2^3&\ 2^2&\ 2^1&\ 2^0&\\ \hline \end{eqnarray} \)
    \(\begin{eqnarray} 0\p{0}& 0\ &0\ &0\ \p{0} &0\ &0\ &0\ &0\ \sc{=}\p{0} 0& \sc{=}\ 0\\ 0\p{0}& 0\ &0\ &0\ \p{0} &0\ &0\ &0\ &1\ \sc{=}\p{0} 1& \sc{=}\ 1\\ 0\p{0}& 0\ &0\ &0\ \p{0} &0\ &0\ &1\ &0\ \sc{=}\p{0} 2& \sc{=}\ 2\\ \ \p{0}& \sc{↓}& &\p{0} \p{0}& \p{0}& \p{0}& \sc{↓} &\p{0} \sc{=}\p{0}\ \sc{↓} &\sc{=}\ \sc{↓}\\ 0\p{0}& 0\ &0 &0\ \p{0} &1\ &0\ &0\ &1\ \sc{=}\p{0} 9& \sc{=}\ 9\\ 0\p{0}& 0\ &0 &0\ \p{0} &1\ &0\ &1\ &1\ \sc{=} 10& \sc{=}\ \sc{A}\\ 0\p{0}& 0\ &0 &0\ \p{0} &1\ &0\ &1\ &1\ \sc{=}11& \sc{=}\ \sc{B}\\ \ \p{0}& \sc{↓}& &\p{0} \p{0}& \p{0}& \p{0}& \sc{↓} &\p{0} \sc{=}\p{0}\ \sc{↓} &\sc{=}\ \sc{↓}\\ 0\p{0}& 0\ &0 &0\ \p{0} &1\ &1\ &1\ &1\ \sc{=}15& \sc{=}\ \sc{F}\\ 0\p{0}& 0\ &0 &1\ \p{0} &0\ &0\ &0\ &0\ \sc{=}16& \sc{=}10\\ 0\p{0}& 0\ &0 &1\ \p{0} &0\ &0\ &0\ &1\ \sc{=}17& \sc{=}11\\ \ \p{0}& \sc{↓}& &\p{0} \p{0}& \p{0}& \p{0}& \sc{↓} &\p{0} \sc{=}\p{0}\ \sc{↓} &\sc{=}\ \sc{↓}\\ 1\p{0}& 0\ &0 &0\ \p{0} &0\ &0\ &0\ &0\ \sc{=}128& \sc{=}80\\ \ \p{0}& \sc{↓}& &\p{0} \p{0}& \p{0}& \p{0}& \sc{↓} &\p{0} \sc{=}\p{0}\ \sc{↓} &\sc{=}\ \sc{↓}\\ 1\p{0}& 1\ &1 &1\ \p{0} &0\ &0\ &0\ &0\ \sc{=}240& \sc{=}\s{F}0 \\ \ \p{0}& \sc{↓}& &\p{0} \p{0}& \p{0}& \p{0}& \sc{↓} &\p{0} \sc{=}\p{0}\ \sc{↓} &\sc{=}\ \sc{↓}\\ 1\p{0}& 1\ &1 &1\ \p{0} &1\ &1\ &1\ &0\ \sc{=}254& \sc{=}\s{FE}\\ 1\p{0}& 1\ &1 &1\ \p{0} &1\ &1\ &1\ &1\ \sc{=}255& \sc{=}\s{FF} \end{eqnarray} \)

    ここで 8 bitを超えるビットパターン数を求てみましょう(代表的な数)
    10bit : (2進10桁)
    "11 1111 1111\(\st{b}\)=3FFh=1023
    ビットパターン数は 1,024 です。
    \(3\ul{FF}h=3\x16^2+\ul{255}\)\(=3\x256+255=1023\)
    (\(\ul{FF}h=15\x16^1+15\x16^0=\ul{255}\))
    ビットパターンは\(1023+1=1024\)となる。
    ビットパターンは10bitのフルの値3FFに+1を足した値である。
    \(\ul{3FFh+1=400h}\)\(=4\x 16^2=4\x256=\ul{1024}\)
    これから先は式❹を使い求める
    12bit : (2進12桁)
    \(\quad P_{12}=2^{12}=4,096\)

    16bit : (2進16桁)
    \(\quad P_{16}=2^{16}=65,536\)

    覚えよう
    4bit 増える毎にビットパターンは16倍になる
    4bitのビットパターン=\(\ul{16}\)(\(=2^4\)) からスタートすると:
    8bit: \(\ul{16}\x 16=\color{red}{\st{256}}\)
    12bit: \(\color{red}{256}\x 16=\color{blue}{\st{4,096}}\)
    16bit: \(\color{blue}{4096}\x 16=\st{6,5536}\)

    2進数の小数

    小数を含む2進数の表示
    例えば, 整数部4ビット, 小数部3ビットと決めておくと
    2進数「1 0 1 1 . 0 1 1」を10進表示する方法:
    \( \begin{array}{c|cccc|ccc} \hline \sc{2進桁重み}& 2^3& 2^2& 2^1& 2^0& 2^{-1}& 2^{-2}& 2^1{-3} \\ \hline \sc{10進では}& 8 & 4& 2& 1& 0.5& 0.25& 0.125\\ \hline \sc{1011.011}& 1 & 0& 1& 1& 0& 1& 1\\ \hline \end{array} \)
    \(\underbrace{ 8\x 1 +2\x 1+ 1\x1}_{11}\) \(+ \underbrace{0.25\x 1+ 0.125\x1}_{0.375}\) \(=11 . 375\)

    逆に10進数「110 . 375」を2進数に変換する方法:
    10進から2進への変換は少し手間がかかります。
    11.375に近いて小さい2進の桁の重みを探しと…\(2^3=8\)です。
    次は3.375近いて小さい…\(2^1=2\)です。
    あとは以下を見てください。
    \(11.375-\ul{8}\sc{(=2^3)}=3.375\)
    \(3.375-\ul{2}\sc{(=2^1)}=1.375\)
    \(1.375-\ul{1}\sc{(=2^0)}=0.375\)
    \(0.375-\ul{0.25}\sc{(=2^{-2})}=0.125\)
    \(0.125-\ul{0.125}\sc{(=2^{-3})}=0\)
    上記の下線部は "ビットが立っている 桁の重み" です, これらを加算します。
    \(2^3,2^1,2^0,2^{-2},2^{-3}\)\(\to \ul{1 0 1 1 . 0 1 1}\)

    例 題


    この例題では "D:10進数データ"とする。

    例題1

    \(1010\ 1111b\)を10進に変換せよ
    基本的な方法で求める
    [上4bit]と[下4bit] に分けています。
    下記の黒マーク\(\blacksquare\)は 2進の桁の重みが立っていること示します。
    \(D=\) \([\ \blacksquare\x 2^7+\square\x 2^6+\blacksquare\x 2^5+\square\x 2^4\ ]\) \(+[\ \blacksquare\x 2^3+\blacksquare\x2^2+\blacksquare\x 2^1+\blacksquare\x 2^0\ ]\)
    黒マークのついた桁の重みを加算すると
    \(=[128+32]+[8+4+2+1] =175d\)

    (別解):実用的な方法…16進に変換した後, 10進に変換。
    \(\underbrace{1\ 0\ 1\ 0}_{Ah} \ \underbrace{1\ 1\ 1\ 1}_{Fh}b\)
    \(=AFh\) \( =(10\x 16^1)+(15\x 16^0)\) \(=160+15=175d\)
    「\(\sc{Ah=10, F=15}\)」を覚えてれば分かる。

    例題2

     425d(10進)を16進,2進数に変換せよ
    原理的に解く方法なので, 忘れても思い出せる。
    はじめに, 10進から16進の変換を行う。 16進の桁の重みを列記しておきます。
    \(\s{425d=\square\x 16^3+\square\x 16^2+\square\x 16^1}\)\(\s{+\square\x 16^0}\)
    \(\s{=\square\x4096+\blacksquare\x 256+\blacksquare\x16+\blacksquare\x1}\) \(\ \sc{:ⓐ}\)
    425を割れるのは "16の桁の重みは256" です, その余り169 も同様に処理する:
    \(\ \frac{425}{256}=\ul{1}\ \sc{余り}169\) \(,\ \frac{169}{16}=\ul{0Ah(=10d)}\ \sc{余り}\ul{9}\)
    上記の下線部を \(ⓐ\)に代入する
    256の重み=1, 16の重み=10, 1の重み=10
    \(425=\s{\clb{ 0\x 4096+1\x 256} + \cl{10\x 16}+ 9\x 1 }\) \(=\clb{0\ 1}\ \cl{A} \ 9\ \s{h}\) \(=\ul{ \clb{1}\ \cl{A}\ 9\ \s{h} }\)

    最後に 16進から2進への変換は次のように直接書けます。
    \( \underbrace{\clb{1}}_{ \clb{0001} } \underbrace{ \cl{A} }_{\cl{1010}}\) \(\underbrace{9}_{1001}\)

    \(\quad =\ul{ \clb{0001}\ \cl{1010}\ 1001\ b} \)

    \(\therefore 425d=\ul{ \clb{1}\ \cl{A}\ 9\ \s{h} }\)\(=\ul{ \clb{0001}\ \cl{1010}\ 1001\ b} \)

    …以上

      

    coffe

    [コーヒーブレイク/閑話]…お疲れさまでした