【数学苦手筆者が調べてみたシリーズ2】数学が苦手な筆者がビット数について調べてみた

# 概要
1. この記事の目的
2. 注意
3. ビットと計算方法
　3-1. ビットと関係のある単位バイトとオクテット
　　バイト
　　オクテット
　3-2. ビットと関係のある単位メガバイト（MB）とギガバイト（GB）
4. 2進数と10進数
5. 10進数から2進数への変換方法
　5-1.10進数では
　5-2.2進数では
6. 2進数から10進数への変換方法
7. まとめ(感想)
8. おわりに
9. 参考記事一覧

# 1.この記事の目的
- ビットに関する単語の理解を深めること
- ビット計算できるようになること

# 2.注意
この記事は以前投稿した【数学苦手筆者が調べてみたシリーズ】記事第二弾です。
あまりにも長くなりすぎると判断したため記事を分けました。

https://qiita.com/takathius2/items/c415ce2cd093f4eb22a2

# 3.ビットとは
前回の記事でint型とfloat型が32ビット4バイト、double型が64ビット8バイトと評で紹介しました。

ではそもそも**ビットってなに？**

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典ビット（bit）](https://wa3.i-3-i.info/word1932.html)
から一部抜粋すると

> コンピュータの世界における「0か1が入る箱」のこと。
あるいはコンピュータの世界における「0か1が入る箱」の数を表す単位。
「コンピュータが処理する最小単位」と言われます。
電気信号のonとoff、つまり「1」と「0」しか判別できません。

このように説明されています。

つまり1ビットでは0と1で2通り。0～1の数値が表現できる。
2ビットだと
- 0,0 
- 0,1  
- 1,0  
- 1,1

の4通り。0～3の値を表現できる。

3ビットだと
- 0,0,0  
- 0,0,1   
- 0,1,0 
- 0,1,1 
- 1,0,0 
- 1,0,1 
- 1,1,0 
- 1,1,1

8通り。0～7の値を表現できる。

でもこうやって全て書いていくのは現実的ではないですね。
0と1の2通りが2回繰り返される、3回繰り返されるということは

2ビットなら2x2=4通り
3ビットなら2x2x2=8通り
:
8ビットなら2x2x2x2x2x2x2x2=256通り

[ビットパターンの計算問題｜かんたん計算問題](https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/easy_calc/bit_pattern/)
よりべき乗で上記の計算は表現できるということで

```math
2^8＝256
```

ということになります。
ビットの計算式は2をｎ回掛けるので
```math
n=ビット数　　
2^n＝表現できるデータ容量（ビットパターン数）
```

結構計算簡単ですね。
（べき乗とか高校生以来だな……）

【補足】
先ほどのサイトで説明があるのですがｎ通りあることを**ビットパターン**と表現するらしく

8ビットだとビットパターンは256個ある

と表現するようです。

# 3-1 ビットと関係のある単位バイトとオクテット
## バイト
ビットとバイトが今まで出てきましたが、この単位はそもそも何を表すのか？
[ビットとバイトの違いを知ってますか！？MBやGB、bpsの意味も解説](https://sophiadigital.com/communication/bit-byte/)

より引用
> 長さや重さをメートルやキログラムで量れるのと同じように、「情報量」にもその単位が定められています。
バイトやビットという単位を決めることで、動画ファイルの容量・ハードディスクの容量・アプリの容量など様々なデジタルデータの情報量がどのくらいか分かるようになります。

すごくわかりやすい。
ビットやバイトは情報量の単位なんですね。

**バイトとは**
8桁の2進数で表される情報量の単位。
8ビット＝1バイト（必ず8ビットというわけではない）

ということらしい。どれだけデータ量の差があるのかイメージしづらいのでビットパターンも求めてみました。

8ビット(256ビットパターン)＝1バイト　ということは
2バイトは……
$2^{16} = 65536$
16ビット(65536ビットパターン)=2バイト

1バイト上がるだけで2桁も情報量が増えました。
めちゃくちゃ増えますね。

2バイトだと何ができるのか？

[https://semiconductor.samsung.com/jp/support/tools-resources/dictionary/bits-and-bytes-units-of-data/](https://semiconductor.samsung.com/jp/support/tools-resources/dictionary/bits-and-bytes-units-of-data/)

より
> 1バイトで表現できるのは半角1文字です。 これは英数字の場合で、ハングルのようなアジアの文字を表記するには、1文字あたり2バイトが必要です。

よく文章をダウンロードするときに表示されるバイト数は文字数などのデータ容量の大きさを表していたんですね。
文章が多いほどダウンロードに時間が掛かる理由がわかりました。
## オクテット
必ず8ビットで1バイトになるものを**オクテット**というそうです。

[IT用語辞典](https://e-words.jp/w/%E3%82%AA%E3%82%AF%E3%83%86%E3%83%83%E3%83%88.html)より
> 現代では「バイト」（byte）も8ビットを表すため同義だが、1980年代頃まではバイトが何ビットを表すかはシステムによって異なっていたため、複数の異なるシステム間で共通して用いられる通信プロトコルなどの分野では、解釈の違いを防ぐためオクテット表記が好まれた。

また、

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典オクテット](https://wa3.i-3-i.info/word11996.html)
より

> 「オクテット」という用語は通信関係でよく登場します。
例えば、IPv4なIPアドレスは
10進数表記：192.168.0.2
2進数表記：11000000.10101000.00000000.00000010
のように8ビットごとに区切って表現されます。
この区切られた部分を、左から順に「第1オクテット」「第2オクテット」「第3オクテット」「第4オクテット」と呼んだりします。

どうやら1バイトが8ビット以外でも表せてしまうから、混乱を防ぐために共通の設定（？）として【オクテット】と宣言したら『1オクテット＝8ビットだ！』となるようにしたんですね。

# 3-2 ビットと関係のある単位MBとGB
これまで
8ビット=1バイトと学びましたがこれ以降は情報量の単位は大体1000ごとに単位が変換されるようです。

1000バイト＝1キロバイト(KB)
1000KB=1メガバイト(MB)
1000MB=1テラバイト(TB)

※~~1000バイトではなく1024バイトで1KBとする場合もあるようです。~~[^1]
[^1]:コメントに紹介されていますが、1024バイト＝1KBは間違い。
1024バイト＝1KiB(キビット)として厳密に決められているとのことでした。

あくまでも1000というのは人間がキリが良いので採用しているだけで、コンピュータとしては最後まで容量を使って1024バイトで表現することが効率が良いのでこのような差があるようです。

他にも関係するものとしてbpsがありますが長くなるので割愛します。

# 4.2進数と10進数
ここまででコンピューターは0と1しかない2進数で情報を管理しているということを学びました。

人間が0～9の10個の数字で様々な表現をする代わりに、コンピューターは電気信号の0と1という単純なものの組み合わせで様々な表現を行っています。

そこでプログラミングにおいてコンパイラーを通して10進数の情報を2進数に変換（コンパイル）する必要があります。

ではコンパイルではどのように計算が行われているのでしょうか？

# 5. 10進数から2進数への変換方法
[2進数と10進数　それぞれの意味と変換方法](https://pyming.info/2021/07/14/binary_and_decimal/)より
※以下数字は変えているものの、方程式や解き方・解説は引用になります
## 5-1. 10進数では
1つの桁の中に入る数字＝**基数は0～9の10**個。
そのため1の位は10の0乗、10の位は10の1乗、100は10の2乗となる。そのため以下のように計算ができる。

1000は千の位から$10^3\times10^2\times10^1\times10^0$

【例】
$5971＝5\times10^3+9\times10^2+7\times10^1+1\times10^0 =5000+900+70+1$
となる。

## 5-2. 2進数では
値を0と1の2個の数字で表現するので**基数は2**個となる

【例】
1000の場合
左から$2^0＝1$の位、$2^1＝2$の位、$2^2＝4$の位、$2^3=8$の位として計算する。

【例2】
$10110＝1\times2^4+0\times2^3+1\times2^2+1\times2^1+0\times1^0=16+0+4+2+0=22$

となる。

左から1の位が$2^0$から始まることを覚えておけばそこまで難しくないですね。

# 6.2進数から10進数への変換方法
やり方は2進数から10進数にする際2を掛けて行ったため、その逆で**2で割っていく**ことで10進数から2進数にできます。

【例】
さっきの22を割っていくと
22÷2=11余り0
11÷2＝5余り1
5÷2=2余り1
2÷2=1余り0

最後の**2÷2＝1余り0**の**1**を最上位として下から順に余りの数を後ろに書いていくと
10110となり、先ほど22を2進数にしたときの数値が求めることができました。

**下から最上位を決める理由としては……**
22を2で割るのに4回使った＝$2^4$となり上に行くほど小に試用した2の数が減っていくため下の位になります。

# 7.まとめ（感想）
・ビット計算は
```math
n=ビット数　　
2^n＝表現できるデータ容量（ビットパターン数）
```

ビットやバイトなど度々目にする単語について知り、そのデータ量を求めることができるようになりました。

思っていたより簡単な分、どれがどういう計算方法かしっかり覚えないと間違いやすい気がします。

今回の記事がどう実務などで生きるかはわかりませんが、半角で1文字表示するのに1バイト使っているんだな、とかなんとなく感覚的にバイトやビットがなんなのかがわかるようになったと思います。

また10進数と2進数を変換できるようにもなったのが思わぬ収穫でした。
そしてデータの単位がヒューマンではなくメカニカルライク（というのかわかりませんが）でできているものなんだな……ということもわかりました。

とはいえやっぱり1000でキッチリ容量を使用してくれた方が助かる（小声）

# 8.おわりに
長くなりましたがここまで読んでくださった方ありがとうございました！

このシリーズは今後続くかどうかは未定ですが、シリーズものとして記事を作るのも悪くないなと考えています。
※間違えていることがあったらお手数ですが教えていただけますと幸いです。

# 9.参考記事一覧
- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典ビット（bit）](https://wa3.i-3-i.info/word1932.html)
- [ビットとバイトの違いを知ってますか！？MBやGB、bpsの意味も解説](https://sophiadigital.com/communication/bit-byte/)
- [ビットパターンの計算問題｜かんたん計算問題](https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/easy_calc/bit_pattern/)
- [IT用語辞典](https://e-words.jp/w/%E3%82%AA%E3%82%AF%E3%83%86%E3%83%83%E3%83%88.html)
- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典オクテット](https://wa3.i-3-i.info/word11996.html)
- [2進数と10進数　それぞれの意味と変換方法](https://pyming.info/2021/07/14/binary_and_decimal/)