科目B応用問題で出題されるビット操作。フラグ管理・偶奇判定・XOR暗号などのパターンを擬似言語で読みこなします。
ビット操作の擬似言語って、どんな書き方になるの?
擬似言語ではビット演算を「論理積」「論理和」「排他的論理和」「シフト」と書くの。
具体的に見ましょう。
代表的な操作と擬似言語の対応:
/* 偶奇判定: 最下位ビットが0なら偶数 */
○ 手続: isEven(整数型: n)
if ((n 論理積 1) = 0)
return 真
else
return 偽
endif
/* 特定ビットを立てる (8ビット中、3ビット目を1に) */
○ 手続: setBit3(整数型: n)
return n 論理和 (1 を 2 ビット左シフト) /* 0000 0100 とのOR */
/* 特定ビットをチェック (3ビット目が1か?) */
○ 手続: checkBit3(整数型: n)
if ((n 論理積 (1 を 2 ビット左シフト)) ≠ 0)
return 真
else
return 偽
endif
ビットマスクって便利ですねぇ
そうなの、特定の位置のビットだけを操作できるのよ。
フラグ管理やパーミッション、ネットワークマスクなどで多用されるの。
もう一つ典型的な例: XOR の性質を利用した値交換 (一時変数なし):
/* XOR を使った値交換 (古典トリック) */ ○ 手続: swapXOR(整数型: a, 整数型: b) a ← a 排他的論理和 b b ← a 排他的論理和 b /* a^b ^ b = a になる */ a ← a 排他的論理和 b /* a^b ^ a = b になる */ /* 結果: a と b の値が交換される */
おぉっ!
一時変数なしで交換できるなんて魔法みたい!
あたし、感動しちゃった!
XORの性質「A^A=0」「A^0=A」を利用しているんです。
理論的には美しいんですが、現代の最適化コンパイラでは普通の swap のほうが速かったりしますね。
試験では「次のビット演算の結果を求めよ」「ビットフラグの操作後の値は?」といった問題が出るのよ。
確認クイズ
整数 n が偶数かを判定するビット操作として、最も適切なものはどれか。
- n 論理積 1 = 0 なら偶数
- n 論理積 1 = 1 なら偶数
- n 論理和 0 = 0 なら偶数
- n を1ビット右シフト
こたえを見る
正解: 1. n 論理積 1 = 0 なら偶数
整数 n と 1 の 論理積 (AND) は最下位ビットを取り出します。最下位ビット = 0 なら偶数 (例: 4 = 100、4 AND 1 = 0)、1 なら奇数。これは商用システムでもよく使われる高速な偶奇判定法です。