今日の午前中に試験をやったのですが、そのうちのひとつの問題に
ID番号の末尾2桁を負数にし、8ビット二進数(2の補数表現)で書け。 (例えばID番号が1234567であれば、-67 -> 10111101となる)
というものがありました。これ、採点するときに手作業で計算すると大変なので、あらかじめC言語で答えを計算するプログラムを書いてあります。今日は、同じプログラムをSwiftで書いてみました。
for idnum in 1234500...1234599 { var negnum = -(idnum % 100) print("\(idnum) (\(negnum)) -> ") for var i=7; i>=0; i-- { print((negnum & (1<<i))>>i) } println() }
すると、こんなかんじに出力されます。
1234500 (0) -> 00000000 1234501 (-1) -> 11111111 1234502 (-2) -> 11111110 1234503 (-3) -> 11111101 1234504 (-4) -> 11111100 1234505 (-5) -> 11111011 1234506 (-6) -> 11111010 1234507 (-7) -> 11111001 1234508 (-8) -> 11111000 1234509 (-9) -> 11110111 1234510 (-10) -> 11110110 1234511 (-11) -> 11110101 (以下略)
負数にする部分はCPUにまかせて、その最下位8ビットぶんをゼロとイチで出力しています。計算部分はすいすい行けましたが、printf()
をどうやってSwift風に書き換えればいいのかに時間を取られてしまいました。
変数negnumを8ビット整数にしたかったのでvar negnum: Int8
と宣言してみましたが、いろいろと型チェックでエラーが出てうまくいきませんでした。出力結果は合っているので良いのですが、どうも釈然としない感じです。もうすこし勉強します。
(2014-07-16追記:明示的にキャストするとエラーなしで実行されます。型推論がうまくいっていなかった模様です。)