コンピュータサイエンス基礎理解メモ


#この記事について


コンピュータサイエンス基礎の、学習内容のアウトプット・自身の振り返り用のメモです。
整理できたものから随時更新します。

**参考書籍**
* [キタミ式イラストIT塾 基本情報技術者 令和02年 Kindle版](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C02%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98-ebook/dp/B082DT76Z8/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3JMDJMOJXZU52&dchild=1&keywords=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88it%E5%A1%BE+%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85+%E4%BB%A4%E5%92%8C02%E5%B9%B4+%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93&qid=1607565323&sprefix=%E3%82%AD%E3%82%BF%E3%83%9F%2Caps%2C116&sr=8-1)

この記事に書かれている内容は上記書籍で学習した内容を基に執筆しています。

基本情報技術者試験用の参考書ですが、コンピュータサイエンスの学習にも最適との情報を得て選択。イラストや噛み砕いた説明で、初学者の私でも読みやすい書籍でした。（書籍内に登場する「どんぐり」という優等生キャラがたまに荒ぶるのが好きです）

以下、メモです。


##n進数
<details><summary>【基本が2進数の理由】</summary>
コンピュータは、電気のオン、オフでものを考える
「オンなら1」「オフなら0」ということで、2進数と相性が良い

<details><summary>【8進数と16進数がコンピュータと相性が良い理由】</summary>
**// 8進数**
ひと桁で0〜7を表現
2進数に基数変換すると0〜111→ひと桁で2進数3桁分（3bit）の情報を表現可能
昔のコンピュータは3の倍数bit数（12bitや24bit）で処理
結果、名前ごとに情報を３bit単位でまとめられる8進数と相性が良かった
**// 16進数**
ひと桁で0〜15を表現
2進数に基数変換すると0〜1111→ひと桁で2進数4桁分（4bit）の情報を表現可能
現在のコンピュータは4の倍数bit数（32bitや64bit）で処理
結果、名前ごとに情報を4bit単位でまとめられる16進数が相性が良い

<details><summary>【基数変換】</summary>
**// n進数→10進数**
各桁の数字の各桁の重みを乗算
**// 10進数→n進数**
整数部：商が0になるまで基数で除算したそれぞれの余りを結果と逆順に並べる
少数部：少数部が0になるまで基数で乗算したそれぞれの整数部を結果順に並べる
**// 2進数→8進数・16進数**
2進数→8進数：2進数を3桁ごとに区切る（ない桁は0を補う）
2進数→16進数：2進数を4桁ごとに区切る（ない桁は0を補う）
8、16進数→2進数は上記の逆を行う

##計算と数値表現
<details><summary>【補数】</summary>
コンピュータは回路をシンプルに保つ為、全ての計算を足し算で表現（負の数が必要）
コンピュータは負の数を表す**「2の補数」**を使う（**全bitを反転させて1を加算する**）
ex.
3=00000011を反転し11111100 → これに1を加算したのが2の補数11111101=-3
＊1bit目は符号として扱うことができる（1の場合は負の数、0の場合は正の数）
＊正の数と負の数は、互いに補数表現となる関係（負の数の方が表せる数が1つ多い）

<details><summary>【シフト演算】</summary>
**// 論理シフト**
**符号を考慮せず**に行うシフト演算
左論理シフトは2^n倍（bit列全体を左にシフト）
右論理シフトは1/2^n倍（bit列全体を右にシフト）
　＊左右ともにシフト後、空になったスペースは0で埋める、はみ出たbitは削除
　＊左論理シフトで1がはみ出た場合：オーバーフロー（そのbit数で表せる範囲を超えた）
　＊右論理シフトで1がはみ出た場合：除算した結果の余り
**// 算術シフト**
**符号を考慮して**行うシフト演算（8bitの2進数だとシフト操作は符号を除いた7bit）
先頭の符号bitを固定にして、それ以降のbitだけを左右にシフト操作
　左算術シフトは符号つきで2^倍、空になったスペースは0で埋める、はみ出たbitは削除
　右算術シフトは符号つきで1/2^n倍、空になったスペースは**符号bitで埋める**、はみ出たbitは削除
　＊左論理シフトで符号bitと異なる数字がはみ出た場合：オーバーフロー
　＊右論理シフトで1がはみ出た場合：除算した結果の余り
**// 乗算と除算**
乗算：2^n同士の足し算に置き換える
ex.
7倍の場合...●×7=●×(4+2+1)=●×(2^2+2^1+2^0)=(●×2^2)+(●×2^1)+●
除算：2^nの引き算を用いる
ex.
元の数字を超えない範囲で割る数を左シフト（ex.2bit）
結果を超えない範囲で再度割る数で左シフト(ex.0bit)
シフトした分を足す（2^2+2^0=4+1=5=101)

<details><summary>【小数点を含む数の表現】</summary>
**// 固定小数点数**
bit列のどの位置に小数点があるかを暗黙的了解として扱う表現方法
最下位bitの右側を小数点と決めれば小数部分に作bitは0となり、整数だけを扱う
コンピュータはこの約束事に基づいて整数を表している
　nbitの固定小数点数で表せる整数の範囲
　符号なし：0〜2^(n-1)
　符号あり：-2^(n-1)〜2(n-1)-1
**// 浮動小数点数**
指数表記を用いて数値を扱う表現方法
**指数表記**...±m×2^e（±=符号、m=仮数、e=指数、基数2は固定）
コンピュータは浮動小数点数として、符号、仮数、指数の可変部分の値をbitに割り当てる
**// 浮動小数点数の正規化**
**正規化**...限られたbit数の中で、有効な桁数が多く取れるよう小数点の位置を調整する
誤差が減る為、精度の高い計算を行える
ex. 0.012345×10^3 → 0.12345×10^4



##論理演算
<details><summary>【ベン図】</summary>
集合（グループ）同士の関係を、図として視覚的に表したもの
![ベン図](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Venn3.svg/120px-Venn3.svg.png)
引用https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E5%9B%B3

<details><summary>【論理積　AND】</summary>
2つある条件の、両方が合致するものを真とみなす
入力Aが真（1）、かつ入力Bも真（1）の場合、演算結果が真（1）となる

<details><summary>【論理和　OR】</summary>
2つの条件の、いずれかが合致するものを真とみなす
入力Aが真（1）、または入力Bが真（1）の場合、演算結果が真（1）となる

###以下　coming soon...

【否定　NOT】など論理演算続き
ビットとバイト
文字コード
マルチメディアデータの表現方法
コンピュータの5大装置
ファイルの管理
データベース
ネットワーク
セキュリティ
システム開発の基礎
データ構造とアルゴリズム