基本情報技術者試験　対策日記〜離散数学〜

# 離散数学の基礎を学んだ振り返り：数字と論理を深掘り

こんにちは！今回は、離散数学の基礎を学んだ内容を振り返り、これまでの学びを報告します。コンピュータの動作やプログラミングにおける重要な原理に触れることができましたので、それらを具体的な例とともに解説します。


![b2130eaecb3eb7b2363d149d74321e8b3a51620e11376c41c3a38079f48c1643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763893/ecdd7081-9b2c-fb76-01c2-a66991a2ae53.png)!



## 1. 数の表現：2進数、10進数、8進数、16進数

### 10進数（Decimal）

私たちが普段使用しているのは10進数です。0から9の10種類の数字を使って数を表現します。例えば、数「345」は次のように展開できます：
345 = 3 × 10^2 + 4 × 10^1 + 5 × 10^0
このように10進数は非常に直感的で、日常生活でも広く使われているため、私たちには馴染み深い表現方法です。

### 2進数（Binary）

コンピュータ内部では2進数が使われています。コンピュータは、0と1という二つの状態（オフとオン）を使って情報を処理します。このため、2進数の理解はコンピュータサイエンスにおいて不可欠です。例えば、「5」を2進数で表すと次のようになります：
5 = 1 × 2^2 + 0 × 2^1 + 1 × 2^0 = 101
コンピュータはビット（0または1の最小単位）を使って計算やデータ処理を行っています。

### 8進数（Octal）と16進数（Hexadecimal）

8進数（基数8）と16進数（基数16）は、2進数を効率的に表現するための方法です。8進数は3ビットごとに、16進数は4ビットごとにまとめて数を表現します。これにより、長い2進数を短縮して表現でき、計算やデバッグが容易になります。

例えば、10進数「13」を16進数に変換すると「D」になります。この変換は、特にコンピュータのメモリアドレスやカラーコードなどの表現に役立ちます。

## 2. 基数と基数変換

### 基数（Radix）

基数とは、数値を表現するために使用する「数字の種類」のことを指します。例えば、10進数は基数が10、2進数は基数が2、16進数は基数が16です。この基数が異なると、数値の表現方法も大きく変わります。

### 基数変換

基数変換とは、異なる基数間で数値を変換する方法です。例えば、10進数の「13」を2進数に変換する方法は以下の通りです。

1. 13を2で割ると、商が6、余りが1。
2. 6を2で割ると、商が3、余りが0。
3. 3を2で割ると、商が1、余りが1。
4. 1を2で割ると、商が0、余りが1。

余りを逆順に並べると、2進数「1101」になります。

### 実務での利用

Ruby on Railsなどで数値やカラーコードを変換する際に、基数変換がよく使用されます。この知識は、実際の開発で非常に役立つ技術です。

## 3. 文字の表現（ASCII、JIS、シフトJIS、EUC、EBCDIC、Unicode）

### ASCII

ASCII（American Standard Code for Information Interchange）は、英数字や記号を7ビットで表現する方法です。例えば、「A」はASCIIコードで「65」に対応します。コンピュータ内部では、文字を対応する数値に変換して処理します。

### JIS、シフトJIS、EUC、EBCDIC、Unicode

日本語などの多言語を扱うためには、さまざまな文字コードが必要です。JISやシフトJISは日本語を効率的に表現するために使われ、例えば「ありがとう」のような日本語の文字列を保存するために使用されます。

Unicodeは、世界中のすべての文字を一元的に表現できる文字コードです。これにより、異なる言語や記号が混在するシステムでも、一貫した文字コード管理が可能になります。Webアプリケーション開発では、Unicodeの理解が不可欠です。
※ちなみに筆者はunicodeがrailsのアップグレードでうまく認識されず、一週間くらい公式マニュアルを彷徨いました。


## 4. 数値の表現（BCD、ゾーン10進数、誤差）

### BCD（Binary Coded Decimal）

BCDは、各桁を2進数で表現する方法です。例えば、10進数「9」をBCDで表すと「1001」になります。BCDは、コンピュータで10進数の計算を行う際に、エラーを減らしつつ効率的に計算を進めるために使用されます。

### ゾーン10進数

ゾーン10進数（Zone Decimal）は、BCDに似ていますが、各桁に「ゾーンビット」を追加することで、符号や区切りを簡単に処理できる方法です。特に、数値と文字列が混在するデータの処理に便利です。

### 誤差

コンピュータで数値を扱う際、誤差が生じることがあります。浮動小数点数の計算や、大きな数と小さな数を加算した場合に誤差が発生します。これには以下のような誤差があります：

- **丸め誤差**：近似的に数値を切り捨てることによって生じる誤差。
- **桁落ち**：非常に小さい数と大きい数を足した際に、小さい数が失われる現象。
- **オーバーフロー**：数値が表現できる最大値を超えた場合に発生するエラー。
- **アンダーフロー**：数値が表現できる最小値を下回った場合に発生するエラー。

これらの誤差を理解することは、精度が重要なアプリケーション（例えば、金融アプリケーションや科学計算）において非常に重要です。

## 5. シフト演算（算術シフト、論理シフト）

### 論理シフト

シフト演算は、ビットを左または右に移動する操作です。論理シフトでは、ビットを移動する際に最も右のビットが切り捨てられ、左側には常に0が挿入されます。例えば、2進数「1101」を右に1ビットシフトすると、「0110」になります。

### 算術シフト

算術シフトは符号付き数に対して使用されます。右シフトの際、最も左のビット（符号ビット）を保持しつつシフトが行われます。例えば、2進数「1111」を右に1ビットシフトすると、「1111」となります。符号を保持したままシフトできるため、負の数に対応できます。

シフト演算は、数値の倍増や半減を高速に行うために使用され、特に低レベルのプログラミングやハードウェア設計で役立ちます。

## 6. 論理回路（半加算器、全加算器）

### 半加算器

半加算器は、2つの1ビット数を加算するための回路です。この回路では、加算した結果の「和」と「繰り上がり」を出力します。例えば、1 + 1 = 0（和）、1（繰り上がり）となります。

### 全加算器

全加算器は、半加算器に加えて、「繰り上がり入力」を受け取る回路です。これにより、3つの1ビット数（2つの入力と繰り上がり）を加算できます。全加算器は、コンピュータの算術処理において重要な役割を果たしており、CPUなどで使用されています。

これらの加算器を理解することで、コンピュータの算術処理の基礎を学び、ハードウェア設計の知識を深めることができます。

---

いかがでしたか？正直ここまでだけでも私はなんだかんだ２週間かかりました。
これからも頑張って4月の試験を目指して勉強していこうと思います。
初学者の方一緒に頑張りましょう✨
![教室の前の方（日中）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763893/00a119ac-034a-5093-9237-49fd1c5c9a10.jpeg)