わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

増やすと,減る

 いきなりですが問題です.

 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行であることが,端的に示されています.「指示を増やせば,出力が減る」事例でした.