読者です 読者をやめる 読者になる 読者になる

Swiftで問題ひとつ解いてみた

今日の午前中に試験をやったのですが、そのうちのひとつの問題に

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追記:明示的にキャストするとエラーなしで実行されます。型推論がうまくいっていなかった模様です。)