基礎理論


# 基数変換
## N進数
**10進数**：0〜9のの数字で数を表す
**2進数**：0と1の数字で数を表す
**8進数**：0〜7の数字で数を表す
**16進数**：0〜９、A〜Fの数字とアルファベットで数を表す

＊　Nは「使える数字の数」を表し、使える数字で収まり切らない時は、桁を上げていく
→ 2進数：2個（0,1,10,11,100...）
→ 8進数：8個（0,1,2,3,4,5,6,7,10,11...）

|10進数|2進数|8進数|16進数|
|--:|--:|--:|--:|
|0|0|0|0|
|1|1|1|1|
|2|`10`|2|2|
|3|11|3|3|
|4|`100`|4|4|
|5|101|5|5|
|6|110|6|6|
|7|111|7|7|
|8|`1000`|`10`|8|
|9|1001|11|9|
|10|1010|12|A|
|11|1011|13|B|
|12|1100|14|C|
|13|1101|15|D|
|14|1110|16|E|
|15|1111|17|F|
|16|`10000`|20|`10`|

8進数：1桁0〜7の数値　→　2進数：0〜111（ひとつの桁で2進数3桁分（3ビット）の情報を表現）
16進数：1桁0〜16の数値　→ 2進数：0〜1111（ひとつの桁で2進数4桁分（4ビット）の情報を表現）

## 基数（各桁の重みになる基本の数）
|||||||
|:--|--:|--:|--:|--:|--:|
|2進数|1|10|100|1000|10000|
|10進数|1|2|4|8|16|
|各桁の重み|2⁰|2¹|2²|2³|2⁴|

＊　2進数の桁が増えると、10進数は2乗される
→ 2進数の各桁の**重み**

n進数が持つ各桁の重みの法則
||←|ー|整数部|小数点|少数部|ー|→|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|nᴺ⁻¹|n²|n¹|n⁰|**.**|n⁻¹|n⁻²|n⁻ᴺ|
|n番目|3桁目|2桁目|1桁目||1桁目|2桁目|n桁目|

＊　n進数の各桁の重み
→ 基数と基数の変換ができるようになる



## N進数　↔︎　10進数の基数変換
**基数変換**：基数であらわした数値を別の基数に換えること


### N進数　→ 10進数
10進数表記の求め方：**各桁の数字に桁の重みを掛け算して足す**
例）　332.5 ＝ 100×3 + 10×3 + 1×2 + 0.1×5

2進数→10進数
|||||||||
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|2進数|1|0|1|**.**|1|0|1|
||×|×|×||×|×|×|
|2進数の重み|4|2|1|**.**|1/2|1/4|1/8|
||↓|↓|↓||↓|↓|↓|
|掛けて足す|4+|0+|1+|**.**|0.5+|0+|0.125|

＝　5.625 （10進数）

### 10進数　→ N進数
整数部：**割り算**
少数部：**掛け算**

13.375　→　2進数
![10進数→N進数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b438671f-0b30-572b-57dc-2f14fd3f3f2b.jpeg)
＊　**無限小数**：小数点が無限に続く
→ 10進数表記では有限だが、基数変換すると無限少数になることも


## ２進数　↔︎　８・１６進数の基数変換
2進数　→　8・16進数
![2進数→8・16進数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/3070270c-95ad-b03a-ec10-b1786bc595bf.jpeg)
8・16進数　→　2進数
![8・16進数→ 2進数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/ba6b8adf-edf6-e3ef-3da0-e1034f0ab1a1.jpeg)



# 補数と固定小数点
## 補数
### 2進数の足し算
10進数の足し算と変わらない
![2進数_足し算.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/2ccfb2d1-6088-28b5-b9a8-841d1788a576.jpeg)

### 2進数の引き算
10進数の引き算と変わらない
![2進数_引き算.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/c6104cfa-7215-18b7-2fce-583797dd897a.jpeg)
0・1しか使えないコンピュータで負の数を表す方法
→ **補数**：2種類
1. その桁数で最大値になるために補う数
1. 次の桁数に繰り上がるために補う数


10進数の場合
![9,10の補数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/3895cb93-392a-e093-ffe1-d94bcd730558.jpeg)
＊　10進数3桁で表現してるため、桁上がりした「1」は無視
→ 123 + 877 = 000
→ 補数 877：123 の対の負の数と言える（9の補数 ＋1 ＝ 10の補数）
→ **2つの補数を使うことで負の数を表現できる**

2進数の場合
![1,2の補数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b01f717d-7d15-c42c-bff8-5c381fb715cd.jpeg)
＊　2進数4ビットで表現してるため、桁上がりの「1」は無視
→ 0011 ＋ 1101 ＝ 0000
→ 補数 1101 : 0011の対の負の数になる
→ **コンピュータは負の数を表すのに2の補数を使う**

（2の補数の求め方）
10進数[3]→ 2進数[0011]

1. 全てのビットを反転させる
1100
1. 1を加える
1101

2進数[1101]　→ 10進数[-3]

（引き算の流れ）
![引き算＿修正版.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/cdd227a6-93c2-8b2d-07ec-b393df6a04e3.jpeg)




















# 固定少数点
コンピュータ内部の数値の表現方法：　小数点の位置を決められた場所に固定する
![固定小数点.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/a621e22c-a9bf-9c32-6eb5-f86555ce1563.jpeg)
2進数8ビットの固定小数点であらわせる整数の範囲
![Nビットで表せる整数の範囲.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/bf409ade-8ce8-21fb-9d96-cfe92b755eb5.jpeg)
























# 浮動小数点
指数表記を使って数値を扱う
→ 大きい数、小さい数を固定小数点より少ないビット数で表せる

## 指数表記
![指数表記.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/413f24fc-3bff-b113-b7ba-dfcd64053635.jpeg)
基数は固定なので、コンピュータは浮動小数点数の、残りの変化する部分（符号・仮数・指数）の値をビットに割り当てて数を表す。

## 正規化
![正規化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/d0133418-f08e-a05f-01be-abd5090d68dd.jpeg)

## 浮動小数点の形式
「どこに何ビット割り当てるか」「どう正規化するか」が異なる
### 32ビットの形式
![32ビット形式.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/33a662c8-aafb-6fe2-167d-aaaf5b231151.jpeg)
例）10進数 0.375 を37ビット形式で表すとどうなるか？
![10進数を32ビット形式へ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/8a2767e8-d623-82c7-dd09-ecfbba64bb38.jpeg)

### IEEE754の形式（32ビット）
![IEEE754形式_jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/4616d7b1-7e61-515b-ca6c-2a8e73e26c79.jpeg)
＊　仮数部 1.XXX で表す 
→ ０.XXX の形よりも仮数部（M）で1ビット多く表現することができる
→ 指数部（E）に使えるビットが1つ増える
＊　**バイアス**：一定の数値を加えること
![バイアス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/fbd05f35-f25f-b6e9-fe0a-b9ba4e964d38.jpeg)
＊　指数に値を加える理由
→ 負の数を正の数だけで表せるため

例）　10進数 0.375をIEEE754の形式で表すとどうなるか？
![IEEE754形式問題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/042bed63-cc2b-3507-861f-d9af9fa56e4f.jpeg)






















# 誤差
実際の数値とコンピュータ内部で表現できる数値に差が生じる
→誤差が生じるのは5つの場合

## 桁あふれ誤差
演算結果、コンピュータの表現できる範囲を超えることで発生する誤差
![桁あふれ誤差.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/7a8a8a68-be1e-7d99-d5a7-3b1cd100cb03.jpeg)
＊オーバーフロー：大きすぎて、表現できる範囲を超えること
＊アンダーフロー：限りなく0に近いて、表現できる範囲を超えること

## 丸め誤差
切り捨て・切り上げ・四捨五入することで発生する誤差
![丸め誤差.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/0fe8de21-ec49-db3f-f52a-aa790e7b585a.jpeg)


## 桁落ち誤差
有効桁数が減ることで発生する誤差
![桁落ち誤差.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/056ce4c7-4f88-1adb-56ab-102967688e0e.jpeg)


##  情報落ち誤差
小さな数値が計算結果に反映されないことで発生する誤差
![情報落ち誤差.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/20cd9b3b-602a-9912-307b-5b750f19b4b2.jpeg)


## 打切り誤差
計算処理を打ち切ることで発生する誤差
例） 円周率：3.1415926535897932384626434....
→ 計算処理を打ち切って 「3.14」 とする 





















# シフト演算
左右にビットをずらして掛け算や割り算をすること
![シフト演算_10進数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/9daa92de-923c-2b6b-f406-440abcf10075.jpeg)
＊　◯倍の倍数は基数と桁の重みで決まる
→ 2進数：　2倍、1/2倍・・・
→ 10進数： 10倍、1/10倍・・・
＊　シフト演算には2種類ある

## 論理シフト
符号を考慮しないシフト演算
→ 最上位のビットも含めてシフトする
![論理シフト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/473833d3-cd7d-5ce6-a98c-728b6435e509.jpeg)
### 論理シフトにおいて「1」がはみ出した時
#### 左論理シフト
掛け算の結果、ビットで表せる範囲を超えたということ
→ **オーバフロー**
#### 右論理シフト
割り算の結果、割り切れず**余り**がはみ出る


## 算術シフト
符号を考慮するシフト演算
![算術シフト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/4ba35a68-1c4d-13f6-2333-66055ead6b22.jpeg)
#### 左算術シフト
符号ビットと異なる数字がはみ出した場合
→ オーバフロー
#### 右算術シフト
1がはみ出した場合
→ 割り算の余り

### 2進数を2ⁿ以外の数字で計算する時
![2進数×7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/1885e9ae-8f13-997e-f720-191751142bea.jpeg)






















# 論理演算
- 0 or 1 を使って行う演算（結果＝ 0 or 1）
- 論理演算の回路　→　CPUに組み込まれてる
![論理演算＿論理回路.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/3de18e18-629e-ae52-f360-7e8eff00d33e.jpeg)

＊　論理回路
→ **MIL記号**：論理回路を図式化
→ **真理値表**：入力と出力のパターンを表にしたもの


＊　論理演算
→　1：真（条件が成立していること）　/2：偽（条件が成立していないこと）とみなして、
　　　０、１の2つの値で行う演算
→ **論理式**：論理演算を式にしたもの

## 論理和（OR） または
どちらか一方が1であれば、１
![論理演算_論理和.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/dd610f25-431d-4f7a-c56c-279607313e0d.jpeg)


## 論理積（AND）　かつ
両方とも1のとき、　１
![論理演算＿論理積.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/5868078d-c734-77f9-3a7f-eababcd0c304.jpeg)

## 否定（NOT）　ではない
1のとき0　または 0のとき　1
![論理演算＿否定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b3b5f811-1905-cbe0-c076-655063cb1fbb.jpeg)

## 論理演算の組み合わせ
### 否定論理和（NOR）　
論理和（OR）　＋　否定（NOT）
![否定論理和.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/6ffe5c6e-88aa-c11b-0307-4dc917057abe.jpeg)

### 否定論理積（NAND）
論理積（AND） ＋ 否定（NOT）
![否定論理積.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b8038fcb-6f8a-05bb-7968-2e17b7a133f9.jpeg)

### 排他的論理和（EOR・XOR）
どちらかが1の時のみ、１
![排他的論理和.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/9e42eb24-2608-bf14-3e6c-cde60a086076.jpeg)

### ビット演算
目的
- 特定のビット列　→　取り出し
- 特定のビット列　→　反転
![ビット取り出し:反転.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/dc0ebad6-1b5a-3739-af02-ddeab48bab80.jpeg)
※ ビットの取り出し：　取り出したいビット部分　AND 1
※ ビットの反転：　取り出したいビット部分　EOR 1

### ド・モルガンの法則
![ド・モルガンの法則.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/8dd74fb0-52d1-3715-a73e-d1614181a404.jpeg)
























# 半加算器・全加算器
**加算器**：２進数の足し算をする回路。
→ 上記の論理回路を使って「2進数の計算処理をする」
## 半加算器
上位桁への桁上がりのみ考慮した加算器

2進数の1桁の足し算
![ 2進数＿1桁＿足し算.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/2f2c978f-a3aa-7b52-cd5c-956b3536d6ec.jpeg)
入力値と出力の関係を真理値表に表す
![半加算器_真理値表.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/e555db30-69b3-f9ff-ba51-4d83d604bea8.jpeg)

## 全加算器
下位桁からの桁上がり、上位桁への桁上がりを考慮した加算器
![全加算器_計算例.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/35094414-b0e9-d422-4bcc-5670060d3081.jpeg)
＊　上記の計算では、2桁目以降は下位桁から繰り上がってくる可能性があり、半加算器だけでは対応できない
→ 2桁目以降は全加算器が必要

全加算器の仕組み
![全加算器＿仕組み.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/965b458b-2147-acbe-cdb2-c51457506cf0.jpeg)
＊　半加算器：半加算器　＋　論理和回路　































# 計測と制御
## データの表現方法
**アナログデータ**：連続して変化する情報　例）　音声・動画・アナログ時計
→ コンピュータで扱うためには、情報を区切って数値で表現する必要がある

**ディジタルデータ**：アナログデータを区切って、「０」「１」に置き換えた情報　
例）　ディジタル時計：1分という範囲を60で区切り、数値化したもの

### 音声のデータ表現
**PCM(Pulse Code Modulation)伝送方式** : アナログの音声データ　→ ディジタルデータ
→ 3段階で変換

#### １. 標本化（サンプリング）
アナログデータを時間単位で区切ること
![標本化（サンプリング）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/8b4c3daf-3853-8f1e-b24c-b41d9f284ffa.jpeg)
＊　**サンプリング周波数**：　１秒あたりのサンプリング回数（単位：Hz）
→ 音楽CD：　44.1kHz  ＝　44100Hz（1秒間に44100回の標本を得る）

#### ２. 量子化
サンプリングしたデータを、縦に区切って数値にすること
![量子化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/1c3e2ded-2177-8b60-e071-e867a7605225.jpeg)
＊　区切る段階数　：　「標本を何ビットのデータで表すか」によって決まる
→ 　8ビット　＝　2⁸（256）段階
→ 各標本を段階に当てはめることで、数値化したディジタルデータになる

#### ３. 符号化
取得した数値を2進数に直す

＊　サンプル周波数が短い・量子化の段階数が多い
→ **元の音に近い&データ容量が大きい**

## コンピュータ制御
**フィードバック制御**：外部の影響をセンサが検知→コンピュータが修正を行う制御
**フィードフォワード制御**：外部の影響を予測できる場合に、前もって必要な修正を行う
**シーケンス制御**：あらかじめ定められた順序に従って、制御の各段階を進めていく

### コンピュータ制御の要素
- A/Dコンバーター
**A/D変換**：アナログデータ　→　ディジタルデータに変換

- センサ
自然の色んな情報を計測して、電気信号へ変換
例）　**ひずみゲージ**　：　物体の変形を検知
　　　**ジャイロセンサ**　：　機器の角速度（回転の速度）、傾き、振動を検知
　　　**人感センサ**　：　人の存在を検知

- アクチュエータ
電気信号を物理的な動作に変換（機器を動かす駆動装置のこと）

- アンプ
マイクロフォンやセンサなどが出力した小さな電気信号を増幅する

### コンピュータの制御技術
#### PWM制御（Pulse Width Modulation）
モーターの回転速度や、LEDの明るさなどをディジタル信号で制御する方式
→　信号の値は「オン」「オフ」のみ
→ 「オン」の時間を長くすると、電流が大きくなって速度や明るさを上げられる
![PWM制御.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/33c22ec5-e25e-c17c-8006-302a3ecd9e2f.jpeg)

#### クロック信号
コンピュータ内部の各装置の動作のタイミングをとる信号
→ 立ち上り・立ち下りのどっちかのタイミングに各装置をあわせている
→ 電圧を1,0の二つに変換
→ 高い電圧＝１、低い電圧＝０　『正論理』
→ 高い電圧＝０、低い電圧＝１　『負論理』
![クロック信号.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/bcd86466-7e2c-29d1-a7ce-01c950bc6825.jpeg)



























# オートマトン
現在の状態・入力で出力が決定するシステム　→ モデル化
![オートマトン＿代表例.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/52b18ff7-45f6-eacd-f64b-7e412b5f1fae.jpeg)

**有限オートマトン**　：　初期状態　→ 受理状態（終了状態）になるもの
**状態遷移図**　：　オートマトンを図にしたもの
![オートマトン_状態遷移図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/cdda6c47-4ab1-56dd-73e2-2b571f71900d.jpeg)

**状態遷移表**　：　オートマトンを表にしたもの
![オートマトン_状態遷移表.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/d13dd2a3-7772-b716-9ba9-5ec067d9712e.jpeg)






























# AI　（Artifical Intelligence） ＝　人工知能
人の知的な活動をコンピュータにさせること

## 機械学習
コンピュータが大量のデータ（**ビックデータ**）を使って学習すること
→ 機械学習の方法は3つ

### 教師あり学習
あらかじめ「問題」と「答え」を提示　→ コンピュータが学習
例）　問題「猫の画像」　答え「猫」　→ 猫の特徴を学習

### 教師なし学習
答えは提示せず、データをグループ分け（**クラスタリング**）→ 答えを自ら導く

### 強化学習
試行錯誤して、良い結果が得られる方法を学習
例）　将棋、囲碁などのゲーム用の人工知能


## ディープラーニング（深層学習）
人の脳神経回路を真似したモデル（**ニュートラルネットワーク**）で学習すること



## 高度な社会
- **超スマート社会**：　ITと現実空間が融合した社会
    - → **Society5.0**の実現
    - → **SDGs**：　全ての人が困窮せず、豊かに暮らす社会を目指す目標






























# 線形代数
## スカラーとベクトル
**スカラー**　：　数値
**ベクトル**　：　スカラーを一列に並べたもの
→ 行ベクトル：横方向に並べたもの
→ 列ベクトル：縦方向に並べたもの
→ **成分**：ベクトルを構成する要素
![行ベクトル＿列ベクトル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/ae3d9615-0030-6d98-472b-00a3755c124b.jpeg)

## 行列
「行」「列」で構成
→ 行　：　横のまとまり
→ 列　：　縦のまとまり
![行列.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/93c13653-4b6c-d50a-b9de-84777eab38f3.jpeg)
上からi行目、左からj行目の成分　＝　a　ᵢʲ
→ a₁₂ ＝　６

### 行列の加算
同じ位置の成分同士を加算。
→ 行と列の数が同じ行列同士だけ加算できる
![行列の加算.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/5ef79a3f-94da-05d5-5ec7-4a451e07fe3f.jpeg)

### 行列の◯倍
行列を２倍、３倍、１/２倍するとき　→ 各成分に掛ける
![行列＿２倍.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/3c4364b0-5406-cc7b-8df5-4da708f23d75.jpeg)

### 行列同士の掛け算
行列A　✖️ 　行列B
→　Aの**列数**とBの**行数**が同じである必要性
![行列同士＿掛け算.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b7a9edae-8f11-375b-a1c6-10f0c1773b49.jpeg)
　
### 逆行列
**正方行列**　：　行と列が同じ数の行列
**単位行列**　：　左上から対角線上の成分が1、それ以外の成分が０の正方行列
![正方行列＿単位行列.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/5b6c2963-09b5-989a-9500-dd33f258c657.jpeg)

**逆行列**　
行列A ✖️ 行列B ＝　単位行列
→ 「BはAの**逆行列**」