このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • n進数 へ行く。

*目次 [#y803f79f]

#contents


*2進数 [#pdfc394e]

 マイコン制御では情報はデジタル量で取り扱う。''デジタル''とは2値的という意味を含み、2値とは情報を2つの状態「0」と「1」の組合わせで表すことである。

 この二者択一で表すことができる情報量を''1ビット''という。情報量の最小単位として用いられる。

 この「0」と「1」を数とみて、色々な数値を表記する方法を''2進法''といい、この2進法で表現された数値を''2進数''という。

**2値表現が使われる理由 [#w95167a3]

-雑音や外的環境の変動に対してもっとも影響を受けにくい。
-2値表現の「0」「1」は、電圧の低い・高いという電気信号に容易に置き換えられる。
-数値情報は2進数で表現され、簡単な電子回路で各種の演算を行わせることができる。

[補講][[センサー]]や[[アクチュエーター]]などの入出力部はアナログ的に動作するものもある。これらと[[マイコン]]を繋ぐ場合、信号を変換してやることが必要がである。このとき[[A/D変換]]あるいは[[D/A変換]]が行われる。


**ビットとバイト [#dc6940d9]

 マイコンでは8ビットをまとめて処理することが多く、8ビットをひとつの単位として''1バイト''と呼ぶ。


**指で2進数を数える [#yfac11c3]

 右手の手のひらを手前に向けてグーに握る。この指が立っていない状態が0である。このとき、指を立てているときは1、折り曲げているときは0と決める。この1は「ビットが立っている」と表現されることもある。

|0|グーの状態|
|1|親指を立てる|
|2|人差し指を立てる|
|3|人差し指と親指を立てる|
|4|中指を立てる|
|…|…|

 このように考えていくと、右手片手で2進数で00000〜11111まで(10進数で0から31まで)カウントできる。

 覚えておくべきサインと対応する数は次の通りである。

|0|グー|
|4|中指だけを立てる「相手を怒らせる」サイン|
|6|人差し指と中指を立てる「ピース」サイン|
|16|小指だけを立てるサイン|
|18|人差し指と小指を立てる「キツネ」|
|31|パー|


**2進数の重み [#d0e42df6]

***10進数の世界 [#y0b8c4c4]

 まず、10進数の世界を考えて欲しい。

 0から1ずつ足すと、「0→1→2→…→9→10」となる。9の次の数がないので、1桁増やして次の数を表す。つまり、10には1が10個分詰まっていることになる。

 また、0から10ずつ足すと「0→10→20→…→90→100」となる。つまり、100には10が10個分詰まっていることになる。

 よって、10進数の各桁の重みは10倍ずつ増えていく。例えば、1万円は千円の十倍の重み(重要度・ありがたみ)があることを意味する。

***2進数の世界 [#m57604e1]

 次に、2進数の世界を考えて欲しい。

 0から1ずつ足すと、「0→1→10」となる。1の次の数がないので、1桁増やして次の数を表す。つまり、10には1が2個分詰まっていることになる。同様に考えると、2進数の各桁の重みは2倍ずつ増えていく。

 指でカウントで考えると次のようになる。

|1|親指だけを立てる|00001|
|2|人差し指だけを立てる|00010|
|4|中指だけを立てる|00100|
|8|薬指だけを立てる|01000|
|16|小指だけを立てる|10000|

 ビットが立っている指がどんどん左に移動していく。つまり1つ指が左に移動する度に、結果的に2倍になっている。言い換えれば、2倍するためにはビットを左に1ビット分だけシフトすればよい。

 2進数を10進数に直すときは、1桁ごとに2倍された重みを掛け合わせて、各桁での結果をすべて足せばよい。

|''桁目''|''重み''|
|1桁目|1=1SUP{0};|
|2桁目|2=2SUP{1};|
|3桁目|4=2SUP{2};|
|4桁目|8=2SUP{3};|
|5桁目|16=2SUP{4};|
|…|…|

例:

&mimetex("(10101)_2");~
&mimetex("= 1 \times 2^4 + 0 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0");~
&mimetex("= 16+4+1");~
&mimetex("=21");

 このように考えれば、n桁目は2SUP{n-1};である。これは等比数列の一般項を求める公式で導ける。

&mimetex("a_n=a_1 \times r^{n-1}=1 \times 2^{n-1}=2^{n-1}");

 逆に、1つ指が右に移動する度に、1/2倍になっている。このように考えれば、2進数の小数についても容易に考えられる。例えば、(1)SUB{2};の1/2倍(10進数の0.5)が(0.1)SUB{2};であり、(0.1)SUB{2};の1/2倍(10進数の0.25)が(0.01)SUB{2};である。

例:

&mimetex("100.111");~
&mimetex("=1 \times 2^2 + 0 \times 2^1 + 0 \times 2^0 + 1 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3}");~
&mimetex("=4+0.5+0.25+0.125");~
&mimetex("=4.875");


*2進数と16進数の比較 [#fb9783bb]
*8進数 [#y3db9b3a]


*16進数 [#y99ecae5]

 16進法は「hexadecimal」【ヘクサデシマル】と呼ばれる。「hexa」という接頭語を持つ英単語は6に関係する。

-例
--hexagon
--hexapad
--hexameter

 『The Microsoft Manual of Style for Technical Publications』には「hexと略さないこと」と書かれているが、一般的に守られていない。むしろ、守らないほうが標準になりつつある。



**16進数がコンピュータと相性がよい理由 [#r0b93410]

 複数ビットの値の表現が各バイトの表現と整合するためには、各バイトが等しい個数のビットに分割されるような体系を使う必要がある。つまり、各バイトを2ビットずつ4個の値に分ける4進数や、4ビットずつ2個の値に分ける16進数が必要になる。一方、16ビット数の8進数表現と、8バイト数が2個分(つまり2バイト)の8進数表現は異なってしまう。

-例:2進数の「10110011 11000101」
--16ビット数の8進数表現で表現すると、131705になる。
---右から3桁ずつ切って8進数に計算。
---こちらが正しい計算結果。
--8バイト数が2個分の8進数表現で表現すると、263 305になる。
---「10110011=263」「11000101=305」

 この理由により、コンピュータは2進数と16進数と特に相性がよい。


**2進数と16進数の比較 [#fb9783bb]

 2進数と16進数には次のような違いがある。

-2進数
--1桁で表示可能な数の範囲:0〜1
--表現に使用する文字:0,1
--使用目的:電圧の高低、電荷の有無などで乗法を保持する。コンピュータの内部表現に使用する。
-16進数
--1桁で表示可能な数の範囲:0〜15
--表現に使用する文字:0〜9,A〜F
--使用目的:コンピュータ内部の情報を人間が見たり、プログラムで表現したりする際に使用する。2進数の欠点である、人間が見たときに「桁数が多いこと」「内容が識別しにくい」という不都合な点を解消する。



*参考文献 [#lc073bbc]

-『制御基礎講座5 プログラム学習によるマイコン制御 基礎編』
-『ソフトウェア開発技術者 合格エッセンシャルハンドブック』
-『ソフトウェア開発技術者 午前対策(基礎編) テキスト』
-『情報処理技術者試験 SUPER記憶術SERIES まんがでわかる情報処理の基本 デジタル数学編』