シフト演算 練習問題

実際に問題を解いて理解を深めよう

レベル1:基本操作


問1:左シフト

2進数の00000011(10進数で3)を1ビット左シフトした場合の2進数表記と10進数表記を答えてください。

正解

2進数:00000110
10進数:6

【解説】

ビットを左に1つずらし、右端に0を埋めます。

00000011 << 1 → 00000110

問2:右シフト

2進数の00001010(10進数で10)を1ビット右シフトした場合の2進数表記と10進数表記を答えてください。

正解

2進数:00000101
10進数:5

【解説】

ビットを右に1つずらし、左端に0を埋めます。

00001010 >> 1 → 00000101

レベル2:実用的な応用


問3:メモリ容量の計算

コンピューターのメモリ容量8GBをバイト単位で表すとき、シフト演算を使って計算してください。
(1GB = 2³⁰ バイト、8 = 2³)

正解

8,589,934,592バイト

【解説】

8GB = 8 × 2³⁰ = 2³ × 2³⁰ = 2³³ バイト

シフト演算で計算: 1 << 33 = 8,589,934,592バイト または段階的に: 1GB = 1 << 30 = 1,073,741,824バイト 8GB = 8 << 30 = 8,589,934,592バイト

問4:画像処理での応用

1024×768ピクセルの画像を1/4のサイズに縮小するとき、新しい画像のピクセル数をシフト演算で計算してください。

正解

196,608ピクセル

【解説】

1/4のサイズ = 縦横それぞれ1/2なので、全体では1/4になります。

元の画像:1024 × 768 = 786,432ピクセル 1/4サイズ:786,432 >> 2 = 196,608ピクセル 確認: 新しいサイズ:512 × 384 = 196,608ピクセル ✓

問5:CPUでの高速化

配列の要素数が64個(2⁶個)のとき、インデックス15の要素にアクセスするための配列計算を、シフト演算を使って高速化してください。
(各要素は4バイト)

正解

オフセット = 15 << 2 = 60バイト

【解説】

配列のオフセット計算では、インデックス×要素サイズで求めます。

通常の計算: オフセット = インデックス × 要素サイズ = 15 × 4 = 60バイト シフト演算による高速化: 4 = 2² なので、×4 は <<2 で計算できる オフセット = 15 << 2 = 60バイト CPUレベルでは、シフト演算の方が乗算より高速!

問6:ネットワークでの応用

IPv4アドレスのサブネットマスク「/24」は、24ビットがネットワーク部を表します。このとき、ホスト部で使用できるアドレス数をシフト演算で計算してください。

正解

256個(実際に使える:254個)

【解説】

IPv4は32ビットなので、ホスト部は32-24=8ビットです。

ホスト部のビット数:32 - 24 = 8ビット 使用できるアドレス数:2⁸ = 1 << 8 = 256個 実際の使用可能数: - ネットワークアドレス(全て0):1個 - ブロードキャストアドレス(全て1):1個 実際に使える:256 - 2 = 254個

レベル3:基本情報試験 過去問


問6:平成28年秋期 問1

10進数の25を2進数で表したものはどれか。

ア:10011 イ:11001 ウ:10101 エ:11101

正解

【解説】

2で割って余りを逆順に並べる

25 ÷ 2 = 12 ... 1
12 ÷ 2 = 6 ... 0
6 ÷ 2 = 3 ... 0
3 ÷ 2 = 1 ... 1
1 ÷ 2 = 0 ... 1

→ 逆順に読む → 11001

問7:平成27年秋期 問1

2進数の10110110を16進数で表したものはどれか。

ア:B6 イ:6B ウ:A6 エ:6A

正解

【解説】

4桁ずつ区切って16進数に変換

1011 = 11 → B
0110 = 6 → 6

→ つなげる → B6

問8:レジスタ操作

ある8ビットレジスタに16進数 A5 が格納されている。この値を2ビット左シフト(論理左シフト)した場合、レジスタに格納される16進数の値はどれか。

ア:28 イ:94 ウ:A5 エ:D4

正解

【解説】

1. 16進数 A5 を2進数に変換します。
A101050101 なので、A51010 0101 です。

2. この値を2ビット左シフトします。左端のビットは捨てられ、右端に0が追加されます。

元の値: 1010 0101
1ビット左シフト: 0100 1010 (左端の1が捨てられ、右端に0が追加)
2ビット左シフト: 1001 0100 (さらに左端の0が捨てられ、右端に0が追加)

3. 結果の2進数 1001 0100 を16進数に変換します。
1001901004 なので、94 です。

解説ページに戻る