1-1. 演習問題
問題1:選択問題
Section titled “問題1:選択問題”次の説明に当てはまる部品を選んでください。
1-1. プログラムを実行中に一時的にデータを保存する場所で、電源を切ると内容が消える。
- A. CPU
- B. メモリ(RAM)
- C. SSD
1-2. 1秒間に3GHzのCPUは、何回の処理ができるか。
- A. 3,000回
- B. 3,000,000回
- C. 3,000,000,000回
1-3. UTF-8で日本語の文字(例:「あ」)は何バイトで表されるか。
- A. 1バイト
- B. 2バイト
- C. 3バイト
問題2:2進数の変換
Section titled “問題2:2進数の変換”次の10進数を2進数に変換してください。
510255
次の2進数を10進数に変換してください。
0110101011111111
問題3:16進数の変換
Section titled “問題3:16進数の変換”次の16進数を10進数に変換してください。
0x0A0xFF0x1F
次の10進数を16進数に変換してください。
16255100
問題4:記述問題
Section titled “問題4:記述問題”4-1. HDDとSSDの違いを2点以上挙げて説明してください。
4-2. OSがなければ、アプリケーション開発者はどのような問題に直面するか?具体的に1つ説明してください。
4-3. 文字化けはなぜ起きるのか、自分の言葉で説明してください。
問題5:考えてみよう
Section titled “問題5:考えてみよう”以下の状況で、ボトルネック(最も遅い原因)はどこにあると考えられるか答えてください。
状況: 大量のCSVファイルを読み込んで集計するプログラムが遅い。CPUの使用率は30%しかない。
問題6:ハンズオン
Section titled “問題6:ハンズオン”実際に手元で確認してみましょう。
① 2進数と16進数を確かめる
次のコマンドを実行し、13 が 1101、255 が FF と表示されることを確認する。
node -e "console.log((13).toString(2)); console.log((255).toString(16).toUpperCase())"② UTF-8 のバイト数を確かめる
次のコマンドを実行し、A が 1 バイト、あ が 3 バイト、😀 が 4 バイトと表示されることを確認する。
node -e "console.log(Buffer.byteLength('A', 'utf8')); console.log(Buffer.byteLength('あ', 'utf8')); console.log(Buffer.byteLength(String.fromCodePoint(0x1F600), 'utf8'))"③ PC の資源を観察する
タスクマネージャーを開き、VS Code やブラウザを起動したときに CPU メモリ ディスク のどれが変化するか観察する。
問題1の解答(クリックで開く)
1-1. 正解:B. メモリ(RAM)
解説
- A の CPU は「計算・判断・制御」を行う処理装置であり、データの保存場所ではない。
- B のメモリ(RAM)は、実行中のプログラムやデータを一時的に保持する。電気でデータを保持する仕組み(DRAM)のため、電源を切るとデータが消える(揮発性)。
- C の SSD はフラッシュメモリ型のストレージで、電源を切ってもデータは消えない(不揮発性)。「一時的」かつ「電源を切ると消える」という2つの条件がRAMを指している。
1-2. 正解:C. 3,000,000,000回
解説 G(ギガ)は「10億(10⁹)」を意味する接頭語。
3 GHz = 3 × 10⁹ Hz = 3,000,000,000 回/秒接頭語の早見表:
接頭語 読み 大きさ K(キロ) 千 10³ M(メガ) 百万 10⁶ G(ギガ) 十億 10⁹ T(テラ) 一兆 10¹² ただし「クロック1回=1命令」とは限らない。現代のCPUは1クロックで複数の命令を実行できる設計になっている(スーパースカラ)。
1-3. 正解:C. 3バイト
解説 UTF-8 は文字の種類によって使用バイト数が変わる可変長エンコーディング。
文字の範囲 バイト数 例 ASCII文字(英数字) 1バイト A,0ラテン文字・記号 2バイト é,ñ日本語・中国語・韓国語 3バイト あ,漢絵文字など 4バイト 😀ASCIIが1バイトなのに対して日本語が3バイトになるのは、UTF-8がASCIIとの後方互換を保ちつつ、多言語文字を効率よく格納するよう設計されているため。
問題2の解答(クリックで開く)
10進数 → 2進数(手順:2で割り続けて余りを逆順に読む)
1. 5 → 0101
5 ÷ 2 = 2 余り 1 ← 最下位ビット2 ÷ 2 = 1 余り 01 ÷ 2 = 0 余り 1 ← 最上位ビット
余りを下から読む → 101(= 0101)2. 10 → 1010
10 ÷ 2 = 5 余り 0 5 ÷ 2 = 2 余り 1 2 ÷ 2 = 1 余り 0 1 ÷ 2 = 0 余り 1
余りを下から読む → 10103. 255 → 11111111
255 ÷ 2 = 127 余り 1127 ÷ 2 = 63 余り 1 63 ÷ 2 = 31 余り 1 31 ÷ 2 = 15 余り 1 15 ÷ 2 = 7 余り 1 7 ÷ 2 = 3 余り 1 3 ÷ 2 = 1 余り 1 1 ÷ 2 = 0 余り 1
余りを下から読む → 11111111(8ビット全て1 = 1バイトの最大値)2進数 → 10進数(手順:右から2の0乗、2の1乗…と掛けて合計する)
4. 0110 → 6
桁の重み: 2³ 2² 2¹ 2⁰ 8 4 2 1値: 0 1 1 0
計算:0×8 + 1×4 + 1×2 + 0×1 = 0 + 4 + 2 + 0 = 65. 1010 → 10
桁の重み: 2³ 2² 2¹ 2⁰ 8 4 2 1値: 1 0 1 0
計算:1×8 + 0×4 + 1×2 + 0×1 = 8 + 0 + 2 + 0 = 106. 11111111 → 255
桁の重み:128 64 32 16 8 4 2 1値: 1 1 1 1 1 1 1 1
計算:128+64+32+16+8+4+2+1 = 255
覚え方:2⁸ - 1 = 256 - 1 = 255(8ビット全1の最大値)問題3の解答(クリックで開く)
16進数 → 10進数(手順:右から16の0乗、16の1乗…と掛けて合計する)
1. 0x0A → 10
0x0A の各桁:0, A(AはF系で10を意味する)
計算:0×16¹ + 10×16⁰ = 0 + 10 = 10
補足:0x はプログラムで「これは16進数」と示す接頭辞(値そのものではない)2. 0xFF → 255
F = 15(16進数の最大値)
計算:15×16¹ + 15×16⁰ = 240 + 15 = 255
補足:0xFF は1バイト(8ビット)で表せる最大値。 2進数で 11111111、10進数で 255 はセットで覚えると役立つ。3. 0x1F → 31
計算:1×16¹ + 15×16⁰ = 16 + 15 = 3110進数 → 16進数(手順:16で割り続けて余りを逆順に読む)
4. 16 → 0x10
16 ÷ 16 = 1 余り 0 1 ÷ 16 = 0 余り 1
余りを下から読む → 10(= 0x10)
ポイント:16進数の桁が1つ増えるのは10進数の16の倍数のとき(10進数と同じ仕組み)5. 255 → 0xFF
255 ÷ 16 = 15 余り 15 → F 15 ÷ 16 = 0 余り 15 → F
余りを下から読む → FF(= 0xFF)6. 100 → 0x64
100 ÷ 16 = 6 余り 4 6 ÷ 16 = 0 余り 6
余りを下から読む → 64(= 0x64)問題4の解答例(クリックで開く)
4-1. HDDとSSDの違い
| 比較項目 | HDD | SSD |
|---|---|---|
| 記録方式 | 磁気ディスク(回転する円盤に磁気で書き込む) | フラッシュメモリ(電気的にデータを保持) |
| 速度 | 遅い(ディスクの回転とヘッドの移動が必要) | 速い(物理的な可動部品がない) |
| 耐衝撃性 | 弱い(衝撃で読み書きヘッドが損傷しやすい) | 強い(可動部品がないため) |
| 価格 | 同容量で安い | 同容量でやや高い(近年は低下傾向) |
| 騒音 | あり(ディスクの回転音) | なし |
なぜエンジニアがこれを知る必要があるか? 本番サーバーのストレージ選定やパフォーマンス問題の調査で知識が役立つ。データベースのようなランダムアクセスが多い用途ではSSDが有利。
4-2. OSがなければ直面する問題(例)
OSがなければ開発者はハードウェアを直接制御しなければならない。
例として、ファイルに書き込む処理を考える。OSがある場合:
file.write("hello") ← 1行でOSに任せられるOSがない場合、開発者は以下を自前で実装する必要がある:
- ディスクのどのセクタ・シリンダに書き込むか
- メーカー固有のディスクコントローラへの命令
- 複数のプログラムが同時にディスクを使おうとしたときの競合制御
OSはこうした低レベルの処理を隠蔽(抽象化)してくれることで、開発者はアプリのロジックに集中できる。
4-3. 文字化けの原因
文字コードとは「数値と文字の対応表」のこと。送り手と受け手が異なる対応表を使うと、同じ数値でも別の文字として解釈される。
例:Shift-JIS と UTF-8 の違い
送信側(Shift-JIS): 「あ」→ 0x82A0 として送信受信側(UTF-8) : 0x82A0 → 「あ」という文字は存在しない → 文字化け対策:送受信の両端で文字コードを統一する(現代のWebでは UTF-8 が標準)。
問題5の解答例(クリックで開く)
ボトルネック:ストレージ(I/O)
根拠となる観察 CPUの使用率が30%しかないということは、CPUは仕事を待っている時間が多い状態を示している。CPUが待つ原因として最も多いのは「データの読み込みが終わるのを待っている」状態(I/O待ち)。
[プログラムの動き]CSVを読み込む(ストレージへアクセス)↓ ← ここで待っている(CPUはアイドル状態)データが届く↓計算する(CPUを使うが、量が少なく30%で済む)↓また次のCSVを読み込む → 繰り返し改善策
対策 効果 HDD → SSD に交換 ディスクアクセス速度が大幅に向上 ファイルをまとめて読む(バッファリング) ディスクへのアクセス回数を減らす 複数ファイルを並列で読む(マルチスレッド) I/O待ちの間に別のファイルを読める このように「CPUが遅い」と「I/Oが遅い」では対策が全く異なるため、ボトルネックの特定(プロファイリング)がパフォーマンス改善の第一歩になる。
問題6の解答例(クリックで開く)
① 2進数と16進数を確かめる
Terminal window $ node -e "console.log((13).toString(2)); console.log((255).toString(16).toUpperCase())"1101FF
toString(2)は数値を2進数文字列に、toString(16)は16進数文字列に変換する。 講義で学んだ変換が、実際にコンピュータ上でも同じ規則で扱われていると確かめられる。
② UTF-8 のバイト数を確かめる
Terminal window $ node -e "console.log(Buffer.byteLength('A', 'utf8')); console.log(Buffer.byteLength('あ', 'utf8')); console.log(Buffer.byteLength(String.fromCodePoint(0x1F600), 'utf8'))"134
Buffer.byteLength()は、文字列がUTF-8で何バイト必要かを調べる関数である。 これにより、ASCII文字は1バイト、日本語は3バイト、絵文字は4バイトになることを実測できる。 「文字数」と「バイト数」は同じではない、という点が実務でも重要である。
③ PC の資源を観察する
たとえばアプリ起動直後は CPU 使用率が一時的に上がり、起動後はメモリ使用量が増えることが多い。 大きなファイルを開くとディスク使用量が増えることもある。 ここで大切なのは正確な数値を覚えることではなく、CPU・メモリ・ストレージはそれぞれ別の役割を持ち、観察の仕方も違う と理解することである。