いきなりですが問題です.
C言語の「^」演算子を使用して,0x55と0x0fのビット単位での排他的論理和(XOR)を求め,「0x??」の形式で解答してください.
さっそくですが解答です.Cのコードは以下の通りで,出力は0x5a
です.
printf("0x%x\n", 0x55 ^ 0x0f);
続いてですが問題です.
C言語のプログラムで,0x55と0x0fのビット単位での否定論理積(NAND)を求め,「0x??」の形式で解答してください.
まずは素直なコードです.演算としてのNANDは,ANDをとってからNOTであり,演算子「&」と「~」を用いた式にしました.
printf("0x%x\n", ~(0x55 & 0x0f));
ビット単位の筆算(手計算)をすると,2進数では11111010となり,これを0x??の形式にすると0xfaなのですが,上記のコードの結果は異なります.出力は0xfffffffa
となりました.
「0x??」と書くと,16進2桁,ですので8ビットの範囲で考えているかのようですが,「~」演算子は整数値を対象とします.今回の実行環境ではint型が32ビットだったため,ビット反転(NOT演算)は,見えていなかった24ビットに対しても,適用されたのでした.
下位8ビットに限定するには,次のようにします.これで,出力は0xfa
になってくれました.
printf("0x%x\n", ~(0x55 & 0x0f) & 0xff);
ここまでの元ネタは,第4クォーターの1年向けプログラミング科目の第1回授業です.テーマは「さまざまな演算子」で,優先順位つきですべての演算子を表示させてから,論理演算子とビット演算子に焦点を当て詳しく解説しました.
XORとNANDの演算については,それぞれの演算を行う自作関数xorとnandを含むプログラムコードを打ち込んでもらい,ソースコードと実行結果を提出させました.「& 0xff」の有無については,解説スライドを作って,第2回授業までにPDFでダウンロードできるようにしました.
ここから,授業で言わなかったことです.上記の「& 0xff」の件は,「指示を増やせば,出力が減る」ということです.他に,「指示を増やせば,出力が減る」事例があるでしょうか…
思い浮かぶのは,wc
コマンドです.10年くらい前,Linuxを使用した演習科目で,「wcコマンドを使用して,ファイルabc.txtの行数を出力するための実行コマンドを解答しなさい」という小課題を出しました.
wcコマンド*1を初めて使うとしても,Linuxの(コマンドラインインタフェースの)実行はどういうものかを知っていれば,wc abc.txt
とするだけです.
適当に作ったファイルabc.txtについて,実行結果が6 38 256 abc.txt
となったとします.最初の「6」が行数です.
「38」と「256」はそれぞれ,語数とバイト数です.除去するには,実行するコマンドをwc -l abc.txt
に変更します.結果は6 abc.txt
となります.abc.txtは6行であることが,端的に示されています.「指示を増やせば,出力が減る」事例でした.