diff --git a/public/calc_pra2.drawio.svg b/public/calc_pra2.drawio.svg new file mode 100644 index 0000000..2603a09 --- /dev/null +++ b/public/calc_pra2.drawio.svg @@ -0,0 +1,4 @@ + + + +
`\frac{2(10 + 5)}...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/output_mkfile.mp4 b/public/output_mkfile.mp4 new file mode 100644 index 0000000..2be31a8 Binary files /dev/null and b/public/output_mkfile.mp4 differ diff --git a/public/output_terminal.mp4 b/public/output_terminal.mp4 new file mode 100644 index 0000000..000a179 Binary files /dev/null and b/public/output_terminal.mp4 differ diff --git a/src/content/docs/textbook/c-lang/beginner/05--syntax.mdx b/src/content/docs/textbook/c-lang/beginner/05--syntax.mdx new file mode 100644 index 0000000..e53362a --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/05--syntax.mdx @@ -0,0 +1,39 @@ +--- +title : 基本構文 +description: C言語の構文について解説する。 +slug: textbook/c-lang/beginner/syntax +--- + +## C言語の基本構文 + +--- + +C言語でプログラムを書くときは、決まった形に従う必要がある。 +以下のコードが、C言語の基本となるプログラムの形だ。 + +```c +#include + +int main(void) { + return 0; +} +``` + +このコードを1行ずつ解説する。 + +### 1. `#include ` + +この行は「**標準入力・出力**」を使えるようにする命令だ。 +標準入力・出力とは「画面に文字を表示する」や「キーボードからの入力を受け取る」機能のことである。 +`#include` は「あるプログラムを追加する」と宣言する命令で、`` という「標準入力・出力の機能が入ったファイル」を取り込んでいる。 + +### 2. `int main(void) { ... }` + +`main` は「**プログラムのスタート地点**」である。 +プログラムを実行すると、**必ず `main` の`{ }`の中に書かれた命令が上から順番に実行される**。 +`int` というのはこの `main` の「戻り値の型」を表しており、「整数を返す」という意味がある。 + +### 3. `return 0;` + +`return 0;` は「**プログラムが正常に終わった**」ことを伝えるための命令である。 +C言語では最後に `return 0;` を書いておくのがルールである。 diff --git a/src/content/docs/textbook/c-lang/beginner/06--output.mdx b/src/content/docs/textbook/c-lang/beginner/06--output.mdx new file mode 100644 index 0000000..ba8e472 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/06--output.mdx @@ -0,0 +1,328 @@ +--- +title : 出力 +description: C言語の出力について、printf関数 の使い方、コメントの書き方、インデントの重要性、改行の方法、実行手順を解説する。 +slug: textbook/c-lang/beginner/output +--- + +import { Aside, Steps, FileTree } from "@astrojs/starlight/components"; +import { Card } from '@astrojs/starlight/components'; + + +## 出力 + +--- + +C言語では、プログラムの実行結果(文字列や数値)をターミナル上に表示するために`printf`関数を使う。 + +```c {4} +#include + +int main(void) { + printf("Hello World!\n"); + return 0; +} +``` + +**実行結果** + +```sh +Hello World! +``` + +`printf` の`( )`に入れた文字列や数値がそのまま出力される。 + +### `printf`関数 + +`printf`関数は、文字列や数値を出力するための関数で`( )`の中に表示したい内容を記述する。 + +```c +printf("表示する文字列\n"); +``` + +- `" "`で囲まれた部分が文字列として出力される。 +- `\n` を入れると改行される。 + + +## コメント + +--- + +C言語では、プログラムに説明を書き込むためにコメントを使うことができる。 + + + +### 1 行コメント (`//`) + +1 行コメントは `//` から始まり、その行の終わりまでがコメントとして扱われる。 + +```c +// これは1行コメント +printf("Hello World!\n"); // この行の後ろにも書ける +``` + +### 複数行コメント (`/* ... */`) + +複数行にわたるコメントは `/*` と `*/` で囲むことで記述できる。 + +```c +/* + これは複数行コメント + 何行でも書ける +*/ +printf("Hello World!\n"); +``` + + + +## インデント + +--- + +インデントとは、コードの行頭に空白を入れて字下げすることを指す。 +インデントを適切に使うことで、プログラムの構造が明確になり、可読性が向上する。 + +### 使い方 + +C言語では、通常 `tab` または `space` を使ってインデントを入れる。 +多くの開発環境では、`tab`を押すと自動で適切なインデントが設定される。 + +#### 良い例 + +`{...}`内の処理をインデントで一段下げて書くと、コードの構造がわかりやすくなる。 + +```c +#include + +int main(void) { +⎵⎵⎵⎵printf("Hello World!\n"); +⎵⎵⎵⎵return 0; +} +``` + +#### 悪い例 + +すべてのコードを詰めて書くと非常に読みにくくなる。 +実行は可能だが、コードの構造がわかりにくくなるため避けたほうがよい。 + +```c +#include + +int main(void) {printf("Hello World!\n");return 0;} +``` + +## 改行 + +--- + +C言語で文字を出力する際、改行をするには `\n` を使う。 +`\n` を入れると、そこで表示位置が次の行に移動する。 + +```c "\n" +#include + +int main(void) { + printf("Hello\nWorld\n"); + return 0; +} +``` + +**実行結果** + +```sh +Hello +World +``` + + + +## 実行の手順 + +--- + +C言語のプログラムは以下の手順で実行する。 + + + +1. ### ファイルを作成する + + + + 1. VSCodeを起動する。 + + 1. VSCodeの上部メニューバーから `ファイル` → `フォルダーを開く…` を選択する。 + + 1. フォルダを選択する。 + + 1. VSCodeの上部メニューバーから `ファイル` → `新しいファイル…` を選択する。 + + 1. `hello.c`という名前でファイルを作成する。 + + + + + +1. ### コードを記述する + + `hello.c`に以下のコードを記述する。 + + ```c title="hello.c" + #include + + int main(void) { + printf("Hello World!\n"); // Hello, World!を表示 + return 0; + } + ``` + + + + 記述が終わったら、VSCodeの上部メニューバーから `ファイル` → `保存` でファイルを保存する(`command`+`S`)。 + +1. ### ターミナルを開く + + + + 1. VSCodeの上部メニューバーから `表示` → `ターミナル` を選択する。 + + 1. ターミナルで、作成した `hello.c` があるディレクトリに移動する。 + 例えば、ファイルが `~/src/prg_c/` にある場合、以下のコマンドを実行する。 + + + + - home + - src + - prg_c + - **hello.c** + - ... + + + + ```sh + cd ~/src/prg_c + ``` + + 1. `ls`コマンドを実行して、`hello.c`が表示されていることを確認する。 + + ```sh + ls + ``` + + + + + +1. ### コンパイルする + + ターミナルで以下のコマンドを実行し、プログラムをコンパイルする。 + + ```sh + gcc hello.c + ``` + + 成功すると、`a.out`という実行ファイルが作成される。 + +1. ### プログラムを実行する + + コンパイルが成功したら、以下のコマンドでプログラムを実行する。 + + ```sh + ./a.out + ``` + + **実行結果** + + ```sh + Hello World! + ``` + + + + + +### 練習問題1 +次の出力をするプログラムを書いてください。 + +**実行結果** +```sh +SysLearn! +``` +ファイル名: `01_issue1.c` +
+ヒント + +
+ +
+模範解答 +```c title="01_issue1.c" +#include + +int main(void) { + printf("SysLearn!\n"); + return 0; +} +``` +
+
+ + +### 練習問題2 +次の出力をするプログラムを書いてください。 + +**実行結果** +```sh +ふるいけや +かわずとびこむ +みずのおと +``` +ファイル名: `01_issue2.c` +
+ヒント + +
+ +
+模範解答 +```c title="01_issue2.c" +#include + +int main(void) { + printf("ふるいけや\n"); + printf("かわずとびこむ\n"); + printf("みずのおと\n"); + return 0; +} +``` +
+
diff --git a/src/content/docs/textbook/c-lang/beginner/07--variable.mdx b/src/content/docs/textbook/c-lang/beginner/07--variable.mdx new file mode 100644 index 0000000..8e0d4ea --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/07--variable.mdx @@ -0,0 +1,377 @@ +--- +title : 変数と型 +description: C言語の基本的な型と変数・定数の使い方について解説する。 +slug: textbook/c-lang/beginner/variable +--- + +import { Aside, Card } from "@astrojs/starlight/components"; + +## 変数 + +--- + +C言語でプログラムを作るとき、一時的にデータを保存するために**変数**を使う。 +変数を使うことで値の保存や変更ができる。 +変数を使うにはまず「**型**」を指定して宣言し、その後値を代入する。 + +### 変数の宣言 + +変数を宣言する基本の形は次の通り。 + +``` +型名 変数名; +``` + +例えば、整数を保存する `int` 型の変数 `number` を宣言する場合は、以下のように書く。 + +```c +int number; // int型の変数numberを宣言 +``` + +この時点では `number` に具体的な値は入っていない。 + +### 変数への代入 + +宣言した変数には `=` を使って値を代入できる。 + +```c +number = 10; // 変数numberに値(10)を代入 +``` + + + +## 基本的な型 + +--- + +C言語にはデータの種類に応じてさまざまな型が用意されている。 +ここでは代表的な型を紹介する。 + +### 整数を扱う (`int`) + +整数を扱うには `int` 型を使う。 + +```c +int i = 100; +``` + +### 小数を扱う (`float`, `double`) + +C言語では、小数を扱うには `float` と `double` という2つの型を使う。 + +```c +float f = 3.14f; +double d = 3.141592653589793; +``` + +#### float と double の違い + +- `float` は **単精度浮動小数点数** +- `double` は **倍精度浮動小数点数** +- `double` のほうが精度が高いが、その分メモリを多く消費する + + + +### 文字を扱う (`char`) + +文字を扱うには `char` 型を使う。 + +```c +char c = 'A'; +``` + + + +### 変数の出力 + +変数を出力する際には、**型ごとに適切なフォーマット指定子**を使う必要がある。 +C言語の `printf` 関数を用いた出力の基本形は以下の通り。 + +```c +printf("フォーマット指定子", 変数); +``` + +各型のフォーマット指定子は以下の表の通り。 + +| 型 | フォーマット指定子 | +|-----------------|------------------| +| `int` | `%d` | +| `float` | `%f` | +| `double` | `%lf` | +| `char`(1文字) | `%c` | +| `char`(文字列) | `%s` | + +```c +int i = 100; +float f = 3.14f; +double d = 3.141592653589793; +char c = 'A'; + +printf("整数: %d\n", i); // 整数を出力 +printf("小数 (float): %f\n", f); // 小数を出力 +printf("小数 (double): %lf\n", d); // 倍精度小数を出力 +printf("文字: %c\n", c); // 文字を出力 +``` + +**実行結果** + +```sh +整数: 100 +小数 (float): 3.140000 +小数 (double): 3.141593 +文字: A +``` + +#### 複数の変数の出力 + +複数の変数を1つの`printf`関数で出力するには、フォーマット指定子を並べて、各変数を`,`で区切り順番を対応させる。 + +```c {10} +#include + +int main(void) { + int i = 100; + float f = 3.14f; + double d = 3.141592653589793; + char c = 'A'; + + // 複数の変数を出力 + printf("整数: %d, 小数 (float): %f, 小数 (double): %lf, 文字: %c\n", i, f, d, c); + + return 0; +} +``` + +**実行結果** + +```sh +整数: 100, 小数 (float): 3.140000, 小数 (double): 3.141593, 文字: A +``` + +### 型の範囲 + +各型には扱える値の範囲が決まっている。以下の表にまとめる。 + +| 型 | 最小値 | 最大値 | +|--------------------|-----------------------------|--------------------------------| +| `int` | `-2,147,483,648` | `2,147,483,647` | +| `float` | `1.175494e-38` | `3.402823e+38` | +| `double` | `2.225074e-308` | `1.797693e+308` | +| `char` | `-128` | `127` | + +### 型の変換(キャスト) + +C言語では、異なる型の変数を扱う際に型の変換(キャスト)が必要になる場合がある。 +型の変換には **暗黙的な型変換** と **明示的な型変換**の2種類がある。 + +#### 暗黙的な型変換 + +C言語では、演算を行う際に型の変換が自動的に行われる。 + +```c +int i = 10; +double d = i; // int から double へ自動変換 +printf("b = %lf\n", d); +``` + +この場合、変数`a` は `double` 型に変換される。 + +#### 明示的な型変換 + +明示的に型を変換するには、**キャスト演算子** `(型名)` を使う。 + +```c +int i = 10; +double d = (double)i; // int を double に変換 +printf("b = %lf\n", d); +``` + +また、小数を整数に変換すると小数部分が切り捨てられる。 + +```c +double d = 3.99; +int i = (int)d; // 小数点以下が切り捨てられる +printf("i = %d\n", i); // 出力: i = 3 +``` + + +### 練習問題1 +`int` 型の変数 `a` を宣言し、数値 `10` を代入して出力するプログラムを書いてください。 + +**実行結果** +```sh +a = 10 +``` +ファイル名: `02_issue1.c` +
+ヒント + +
+ +
+模範解答 +```c title="02_issue1.c" +#include + +int main(void) { + int a = 10; + printf("a = %d\n", a); + return 0; +} +``` +
+
+ + + +### 練習問題2 +`char` 型の変数 `a`、`b` を宣言し、それぞれ `A`、`B` を代入して出力するプログラムを書いてください。 + +**実行結果** +```sh +a = A, b = B +``` +ファイル名: `02_issue2.c` +
+ヒント + +
+ +
+模範解答 +```c title="02_issue2.c" +#include + +int main(void) { + char a = 'A', b = 'B'; + printf("a = %c, b = %c\n", a, b); + return 0; +} +``` +
+
+ + + +### 練習問題3 +`int` 型の変数 `a` に `100` を代入し、`double` 型の変数 `b` に `a` を代入したあと、それぞれの値を出力してください。 + +**実行結果** +```sh +a = 100 +b = 100.000000 +``` +ファイル名: `02_issue3.c` +
+ヒント + +
+ +
+模範解答 +```c title="02_issue3.c" +#include + +int main(void) { + int a = 100; + double b = a; // int から double への暗黙的な型変換 + printf("a = %d\n", a); + printf("b = %lf\n", b); + return 0; +} +``` +
+
+ +## 定数 + +--- + +定数は「一度決めたら変更できない値」のことである。C言語では、`#define` と `const` の2つの方法で定数を定義できる。 + + + +### `#define` + +`#define` を使うと、プログラム全体で使える定数を定義できる。 + +```c {3} +#include + +#define PI 3.141592 + +int main(void) { + printf("円周率: %f\n", PI); + return 0; +} +``` + +- `#define` で定義した定数は、コンパイル時に直接数値に置き換えられる。 + +### `const` + +`const` を使うと、特定の変数の値を変更できないようにする。 + +```c +const double PI = 3.141592; +PI = 3.0; // エラー!定数の値は変更できない +``` + +- `const` を使うと、コンパイル時に値の変更を禁止できる。 + + +### 練習問題4 +`#define` を使って最大値と最小値を定義し、その値を出力するプログラムを書いてください。 + +**実行結果** +```sh +最大値: 100 +最小値: 0 +``` +ファイル名: `02_issue4.c` +
+ヒント + +
+ +
+模範解答 +```c title="02_issue4.c" +#include + +#define MAX 100 +#define MIN 0 + +int main(void) { + printf("最大値: %d\n", MAX); + printf("最小値: %d\n", MIN); + return 0; +} + +``` +
+
\ No newline at end of file diff --git a/src/content/docs/textbook/c-lang/beginner/08--calc.mdx b/src/content/docs/textbook/c-lang/beginner/08--calc.mdx new file mode 100644 index 0000000..2254be5 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/08--calc.mdx @@ -0,0 +1,251 @@ +--- +title : 四則演算 +description: C言語の四則演算について、演算子 の使い方、計算の優先順位を解説する。 +slug: textbook/c-lang/beginner/calc +--- + +import { Aside, Card } from "@astrojs/starlight/components"; + +## 四則演算 + +--- + +C言語の四則演算は、基本的な数学の計算を行うための演算子(オペレーター)を使う。 + +| 演算子 | 説明 | +|------------|---------------------| +| `+` | 加算(足し算) | +| `-` | 減算(引き算) | +| `*` | 乗算(掛け算) | +| `/` | 除算(割り算) | +| `%` | 剰余(割ったあまり) | + +### 加算(`+`) + +加算演算子(`+`)は、2つの数値を足し算するために使う。 + +```c {5} +#include + +int main(void) { + int a = 10, b = 3; + printf("a + b = %d\n", a + b); // 10 + 3 = 13 + return 0; +} +``` + +**実行結果** + +```sh +a + b = 13 +``` + +### 減算(`-`) + +減算演算子(`-`)は、2つの数値を引き算するために使う。 + +```c {5} +#include + +int main(void) { + int a = 10, b = 3; + printf("a - b = %d\n", a - b); // 10 - 3 = 7 + return 0; +} +``` + +**実行結果** + +```sh +a - b = 7 +``` + +### 乗算(`*`) + +乗算演算子(`*`)は、2つの数値を掛け算するために使う。 + +```c {5} +#include + +int main(void) { + int a = 10, b = 3; + printf("a * b = %d\n", a * b); // 10 * 3 = 30 + return 0; +} +``` + +**実行結果** + +```sh +a * b = 30 +``` + +### 除算(`/`) + +除算演算子(`/`)は、2つの数値を割り算するために使う。 + +```c {5} +#include + +int main(void) { + int a = 10, b = 3; + printf("a / b = %d\n", a / b); // 10 / 3 = 3(整数の割り算) + return 0; +} +``` + +**実行結果** + +```sh +a / b = 3 +``` + + + +### 剰余(`%`) + +剰余演算子(`%`)は、割り算したときの余りを求めるときに使う。 + +```c {5} +#include + +int main(void) { + int a = 17, b = 5; + printf("a %% b = %d\n", a % b); // 17 % 5 = 2 + return 0; +} +``` + +**実行結果** + +```sh +a % b = 2 +``` + +これは、`17` を `5` で割ると `3` あまり `2` になるため、`2` が出力される。 + + + + +### 練習問題1 +`int`型の変数`a`、`b`に数値`10`、`5`を代入し、それらを使って加算、減算、乗算、除算、剰余の結果を出力してください。 + +**実行結果** + +```sh +10 + 5 = 15 +10 - 5 = 5 +10 * 5 = 50 +10 / 5 = 2 +10 % 5 = 0 +``` + +ファイル名: `03_issue1.c` + +
+ヒント + +
+ +
+模範解答 + +```c title="03_issue1.c" + +#include + +int main(void) { + int a = 10, b = 5; + printf("%d + %d = %d\n", a, b, a + b); + printf("%d - %d = %d\n", a, b, a - b); + printf("%d * %d = %d\n", a, b, a * b); + printf("%d / %d = %d\n", a, b, a / b); + printf("%d %% %d = %d\n", a, b, a % b); + return 0; +} +``` + +
+
+ +## 演算子の優先順位 + +--- + +C言語では、演算子の優先順位が決まっており、基本的に数学と同じルールに従う。 + +### 優先順位(高い順) + +1. `(...)`(かっこ内の計算が最優先) +1. `*` `/` `%`(掛け算・割り算・剰余) +1. `+` `-`(足し算・引き算) + +```c +#include + +int main(void) { + int result1 = 10 + 2 * 3; + printf("10 + 2 * 3 = %d\n", result1); // 10 + 2 * 3 = 16 + + int result2 = (10 + 2) * 3; + printf("(10 + 2) * 3 = %d\n", result2); // (10 + 2) * 3 = 36 + + return 0; +} +``` + +- `10 + 2 * 3` → `2 * 3` を先に計算 → `10 + 6 = 16` +- `(10 + 2) * 3` → `10 + 2` を先に計算 → `12 * 3 = 36` + + +### 練習問題2 +次の数式の計算結果を`double`型で出力してください。 + +![2 * (10 + 5) / 4 - 3](/calc_pra2.drawio.svg) + +**実行結果** +```sh +計算結果: 5.500000 +``` +ファイル名: `03_issue2.c` +
+ヒント + +
+ +
+模範解答 +```c title="03_issue2.c" +#include + +int main(void) { + double result = 2 * (10 + 5) / 4 - 3; + printf("計算結果: %lf\n", result); + return 0; +} +``` +
+
+ + diff --git a/src/content/docs/textbook/c-lang/beginner/09--input.mdx b/src/content/docs/textbook/c-lang/beginner/09--input.mdx new file mode 100644 index 0000000..d2196e4 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/09--input.mdx @@ -0,0 +1,214 @@ +--- +title : 入力 +description: C言語の入力について、scanf関数 の使い方、色んな型の入力を解説する。 +slug: textbook/c-lang/beginner/input +--- + +import { Aside, Card } from "@astrojs/starlight/components"; + +## 入力 + +--- + +C言語におけるキーボード入力の基本は、`scanf`関数を使って行う。 + +### `scanf`関数 + +`scanf`関数は、標準入力(キーボード)からデータを受け取り、それを指定した変数に格納する関数である。基本的な構文は以下の通り。 + +```c +scanf("フォーマット指定子", &変数); +``` + +例えば、整数を入力する場合は次のように書く。 + +```c +int num; +scanf("%d", &num); +``` + +このコードの流れは以下のようになる。 + +1. `scanf`関数が実行されると、プログラムは標準入力からのデータを待機する。 +1. キーボードで数値を入力し、`Enter`を押す。 +1. 入力された数値が変数`num`に格納される。 + + + +## 色んな型の入力 + +--- + +C言語では、異なるデータ型ごとに適切なフォーマット指定子を使って入力を受け取る。 + +| データ型 | フォーマット指定子 | 例 | +|---------------|----------------|----------------------| +| `int` | `%d` | `scanf("%d", &num);` | +| `float` | `%f` | `scanf("%f", &num);` | +| `double` | `%lf` | `scanf("%lf", &num);` | +| `char`(1文字) | `%c` | `scanf("%c", &ch);` | +| `char`(文字列) | `%s` | `scanf("%s", str);` | + +### 整数の入力 + +```c +int i; +scanf("%d", &i); +printf("入力された整数: %d\n", i); +``` + +**入力例** + +```sh +42 +``` + +**実行結果** + +```sh +入力された整数: 42 +``` + +### 小数の入力 + +```c +float d; +scanf("%f", &d); +printf("入力された小数: %f\n", d); +``` + +**入力例** + +```sh +3.14 +``` + +**実行結果** + +```sh +入力された小数: 3.140000 +``` + +### 文字の入力 + +```c +char c; +scanf("%c", &c); +printf("入力された文字: %c\n", c); +``` + +**入力例** + +```sh +A +``` + +**実行結果** + +```sh +入力された文字: A +``` + +### 複数の入力 + +`scanf`関数は複数の値を一度に入力でき、入力は`space`で区切られる。 + +```c +int x; +float y; +char z; +scanf("%d %f %c", &x, &y, &z); +printf("x: %d, y: %f, z: %c\n", x, y, z); +``` + +**入力例** + +```sh +10 3.14 A +``` + +**実行結果** + +```sh +x: 10, y: 3.140000, z: A +``` + + +### 練習問題1 +`int`型の変数`x`に数値を入力し、`x`を2乗した結果を出力するプログラムを書いてください。 + +**入力例** +```sh +3 +``` +**実行結果** +```sh +x^2 = 9 +``` +ファイル名: `04_issue1.c` +
+ヒント + +
+ +
+模範解答 +```c title="04_issue1.c" +#include + +int main(void) { + int x; + scanf("%d", &x); + printf("x^2 = %d\n", x*x); + return 0; +} +``` +
+
+ + +### 練習問題2 +`int`型の変数`x`、`y`に数値を入力し、`x`と`y`の差を出力するプログラムを書いてください。 + +**入力例** +```sh +5 2 +``` +**実行結果** +```sh +5 - 2 = 3 +``` +ファイル名: `04_issue2.c` +
+ヒント + +
+ +
+模範解答 +```c title="04_issue2.c" +#include + +int main(void) { + int x, y; + scanf("%d %d", &x, &y); + printf("%d - %d = %d\n", x, y, x - y); + return 0; +} +``` +
+
\ No newline at end of file diff --git a/src/content/docs/textbook/c-lang/beginner/10--ex-bit.mdx b/src/content/docs/textbook/c-lang/beginner/10--ex-bit.mdx new file mode 100644 index 0000000..6c809a8 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/10--ex-bit.mdx @@ -0,0 +1,198 @@ +--- +title : ビット演算 +description: C言語のビット演算について解説する。 +slug: textbook/c-lang/beginner/bit +--- + +import { Aside, Card } from "@astrojs/starlight/components"; + +## ビットとは + +--- + +**ビット**(bit)はコンピュータが扱う最小単位の情報である。 +ビットは`0`または`1`の値を持ち、これを組み合わせることで数値や文字を表現する。 +例えば、 + +- `0b0001` は10進数の `1` +- `0b0010` は10進数の `2` +- `0b1010` は10進数の `10` + +また、先頭に`0b`を付けることでその数が2進数であることを表している。 + +## ビット演算 + +--- + +ビット演算とは、数値をビット単位で操作する演算のことである。 +ビット演算には、AND、OR、XOR、NOTの4つの基本的な演算がある。 + +### AND(論理積) `&` + +AND演算は、2つのビットがともに `1` のときに `1` を返し、それ以外は `0` になる。 + +| A | B | A & B | +|---|---|-------| +| 0 | 0 | 0 | +| 0 | 1 | 0 | +| 1 | 0 | 0 | +| 1 | 1 | 1 | + +```c +int a = 0b1100; // 12 +int b = 0b1010; // 10 +int result = a & b; // 0b1000 (8) +``` + +### OR(論理和) `|` + +OR演算は、どちらかのビットが `1` であれば `1` を返し、両方 `0` の場合のみ `0` になる。 + +| A | B | A \| B | +|---|---|-------| +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 1 | + +```c +int a = 0b1100; // 12 +int b = 0b1010; // 10 +int result = a | b; // 0b1110 (14) +``` + +### XOR(排他的論理和) `^` + +XOR演算は、2つのビットが異なっている場合に `1` を返し、同じ場合は `0` になる。 + +| A | B | A ^ B | +|---|---|-------| +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 | + +```c +int a = 0b1100; // 12 +int b = 0b1010; // 10 +int result = a ^ b; // 0b0110 (6) +``` + +### NOT(否定) `~` + +NOT演算は、各ビットを反転させる。 + +| A | ~A | +|---|----| +| 0 | 1 | +| 1 | 0 | + +```c +int a = 0b1100; // 12 +int result = ~a; // 0b0011 (3) +``` + + +### 練習問題1 +`int` 型の変数 `a` に `0b1101`(`13`)、`b` に `0b1011`(`11`)を代入し、それらの AND, OR, XOR 演算を行い、結果を出力してください。 + +**実行結果** +```sh +a & b = 9 +a | b = 15 +a ^ b = 6 +``` +ファイル名: `05_issue1.c` +
+ヒント + +
+ +
+模範解答 +```c title="05_issue1.c" +#include + +int main(void) { + int a = 0b1101; // 13 + int b = 0b1011; // 11 + printf("a & b = %d\n", a & b); // 0b1001 (9) + printf("a | b = %d\n", a | b); // 0b1111 (15) + printf("a ^ b = %d\n", a ^ b); // 0b0110 (6) + return 0; +} +``` +
+
+ +## シフト演算 + +--- + +シフト演算はビットの位置を左右にずらすことで数値を変化させる演算である。 + +### 左シフト `<<` + +左シフトはビットを左に移動し、空いた部分を `0` で埋める。 + +```c +int a = 0b1100; // 12 +int result = a << 1; // 0b11000 (24) +``` + + + +### 右シフト `>>` + +右シフトはビットを右に移動させる。 + +```c +int a = 0b1100; // 12 +int result = a >> 1; // 0b0110 (6) +``` + + + + +### 練習問題2 +整数 `a` に `0b10010`(`18`)を代入し、次の操作を行った結果を出力してください。 + +- `a` を **左に 2 ビット** シフト +- `a` を **右に 1 ビット** シフト + +**実行結果** +```sh +a << 2 = 72 +a >> 1 = 9 +``` +ファイル名: `05_issue2.c` +
+ヒント + +
+ +
+模範解答 +```c title="05_issue2.c" +#include + +int main(void) { + int a = 0b10010; // 18 + printf("a << 2 = %d\n", a << 2); // 0b1001000 (72) + printf("a >> 1 = %d\n", a >> 1); // 0b01001 (9) + return 0; +} +``` +
+
\ No newline at end of file