![見出し画像](https://assets.st-note.com/production/uploads/images/70542280/rectangle_large_type_2_7af432ec5004dc732667e98b60f98666.png?width=1200)
【エンジニアの道は果てしない】 コンピュータが見ている0,1(ゼロイチ)の世界
こんにちは。すうちです。
普段使っているパソコンやスマホ。キーボードや指で画面を操作してネットで何か調べたり。仕事やゲームしたり。
例えば、スマホを知らない時代の人が見たら、まさに魔法だと思うのではないでしょうか。
今回はスマホやパソコンに入っているコンピュータ(CPUやマイコン)の視点から見る世界(エンジニア視点の解釈)を書きたいと思います。
1.そこにはゼロイチしかない
究極的に行き着く話では、コンピュータが理解できるのは0と1(信号で言うHighとLow)です。
信号のHighとLowは電圧値の大小関係で見分けられます。
例えば、信号の電圧範囲が0〜1.8Vの場合、中央の0.9Vより大きいとHigh(1)、小さければLow(0)とすると2つの状態を判断できます。
CPUはクロック(周波数)で動作し、そのクロックと同期してデータを取り込んだり、命令を実行することができます。
しかし0と1だけだと、2つの状態しか表現できません。これでは不便です(スマホの様な複雑なことはできる気がしない)。
では、この0と1をいくつか集めるとどうでしょうか。
2.ゼロイチが集まると
1個が0と1を表すマスを8個集めて考えてみます。
その場合
00000000は 0
00000001は 1
00000010は 2
00000011は 3
:
00000111は 7
00001000は 8
:
11111110は 254
11111111は 255
のパターン作れるので、0〜255(計:256個)まで表現の幅が広がります。
bit(ビット)という言葉は聞いたことあるかもしれませんが、0と1を表す1個のマスが1bit。8個集まったら8bitです。
ちなみに、データの単位はbyte(バイト=8bit)で表すことが多いです。
3.ルールによって解釈が変わる
◆2進数、10進数、16進数
0、8、16、32、64の数字があるとします。
突然ですが問題です。これらを全部足すといくつでしょうか。
正解は、前提条件によって答えは変わるです。
通常は10進数で考えますが、プログラムでは16進数で扱うことも多いので正しく計算するには前提条件が必要です。
16進数の場合、16区切りで桁上がるので、0x10は10進数の16を意味します。0x16は22(=16x1+6)です。同様に0x32は50、0x64は100です。
先ほどの答えは、10進数の場合120、16進数の場合180です。
補足:
16進数の場合、プログラムでは頭に0x等をつけて0x16、0x32と表記します。先ほど出てきた00000000~11111111は2進数表記です(通常頭にbをつける)。10進数の16は、b00010000。32はb00100000で表します。
◆文字コード
コンピュータの世界は0と1しか解釈できない場合、どうやって文字を認識できるのでしょうか。
それは、あらかじめ決めたルール(変換表)に沿って解釈するです。
これを文字コードといいます。文字コードには、古くから使われている1バイトで英数字を表すアスキーコードがあります(ひらがなや漢字は含まれない)。
グローバル化した現代では、漢字やひらがな、他の言語(文字)も表現できないと不便も多いので、今は広く共通で使えるUnicodeと呼ばれる文字コード(1文字を8〜32bitに割り当て)が一般的です。
◆データフォーマット
前置き長くなりましたが、今回の本題です。
下記は画像のBMPファイル(ヘッダ領域周辺)の抜粋です。
![](https://assets.st-note.com/img/1642920268856-0pRUg2V15Y.png?width=1200)
先頭6バイトは、数字6個(16進数)と解釈すると0x42 0x4D 0x56 0x58 0x0F 0x00。アスキーコードでは”BMVX..” です。
BMPのフォーマットは、先頭2byteのファイルType領域に続き、ファイルサイズ4byte、予約領域4byteの後、画像データの先頭位置(オフセット)4byte と定義されてます。
上記に沿うと
0x42,0x4D(先頭2byte)= ’BM’
0x000F5856(4byte)= ファイルサイズ1,005,654byte
(リトルエンディアンはバイトの並び順序逆)
0x00000036(4byte)=画像データ先頭 54byte目
なので確かにフォーマット通りです。
この例は画像ですが、音楽や動画も同様に拡張子(規格)で決まったヘッダ領域があり、コンピュータはそのルールに沿って中身を解釈します。
よくある拡張子を変えるとファイルが読めなくなる話は、例えばBMPファイルをPNG拡張子にすると、本当はBMPなのにPNGフォーマットと思ってデータを読むので何かおかしい(先頭にあるはずの’.PNG’がない等)と判断され「このファイルは表示できません」となる訳です。
補足:
ソフトウェアによっては、拡張子だけでなくヘッダ情報を解析(推測)してフォーマットにあわせて処理できるものもあります。
画像データの場合、コンピュータは画像の色情報(RGB)を参照するので、例えばSNSで写真や動画を共有した場合も色んな端末で見れます。RGBも決められたフォーマットの一つです。
最後に
今はネットにつながらない世界は考えられないと思いますが、ネットワーク通信もHTTP等のプロトコル(通信先とデータのやり取りを決めたルール)を解釈して、コンピュータが色んなサービスを実現しています。
別の視点では、エンジニアはこれらのルールに沿ってコンピュータの動きをプログラムしているとも言えます。
まとめると
コンピュータは0,1で世界をみている
その0,1データを組み合わせると幅広い表現ができる
データは解釈次第で見え方が変わる(同じルールで見る必要ある)
コンピュータはあらかじめ決められたルールに沿って動く様にプログラムされているので様々なことを実現できる
今の便利な世の中は、先人たちの知恵とアイデア(人とコンピュータの対話ルール)の蓄積があって成り立っていると感じます。
最後まで読んで頂き、ありがとうございました。
いいなと思ったら応援しよう!
![すうち](https://assets.st-note.com/production/uploads/images/66180906/profile_67479c699579cbf81e535c0c50b39b0b.png?width=600&crop=1:1,smart)