モジュール詳細:コード修正

「ソースコードがずらっと並んでるな…」 「それで、どうやって爆弾のメインフレームにハッキングするんだ?」

ディスプレーには*C#言語のソースコードが表示され、10個の数字ボタン、負の記号のボタン、バックスペースボタン、入力(Enter)ボタンが付いている。モジュールを解除するには、ソースコード上に数字を入力し、コードを実行したときに、モジュールが解除されるようにしなければならない。しかし、ソースコードを実行したとき、ミスが記録されるような数字を入力した場合、ミスが記録される。

下の表を使用し、それぞれのコードの意味を参照する。注意点として、変数に新しい値が代入されると、古い値は書き換えられる。コードは上から下の順に実行される。よって、コードはその行より上にあるコードが先に実行され、その行より下のコードは後に実行される。

コード: 意味:
int n = 0; 整数の変数「n」に新しい値、0が代入される。整数は小数点を持てないため、演算結果に小数点が含まれる場合、小数点以下は削除される。イコールの左側にある名前が「n」であれば、右側にある数字がモジュールで変更できる値である。それ以外の値はすべて変更できない。
x = y; 変数「x」に「y」の値を代入する。
x = y + z; 変数「x」に「y」と「z」の値の和を代入する。
x = y - z; 変数「x」 に「y」と「z」の値の差を代入する(「y」引く「z」と同等)。
x = y * z; 変数「x」 に「y」と「z」の値の積を代入する。
x = y / z; 変数「x」 に「y」と「z」の値の商を代入する (「y」割る「z」と同等)。
x = y % z; 変数「x」に「y」を「z」で割った余りを代入する。(moduloとしても知られる)。
x = y & z; 変数「x」に、ANDゲートに「y」と「z」を入力した結果を代入する。
x = y | z; 変数「x」に、ORゲートに「y」と「z」を入力した結果を代入する。

* C#のリファイナレンス:
https://ja.wikipedia.org/wiki/C_Sharp

x = y ^ z; 変数「x」に、XORゲートに「y」と「z」を入力した結果を代入する。
x = y << z; 変数「x」に、「y」の値を「z」の回数だけ左へビットシフトした結果を代入する。
x = y >> z; 変数「x」に、「y」の値を「z」の回数だけ右へビットシフトした結果を代入する。
x += y; 「x」の値を「y」の値の分だけ加算し、その値を「x」に代入する。
x -= y; 「x」の値を「y」の値の分だけ減算し、その値を「x」に代入する。
x *= y; 「x」の値を「y」の値の分だけ乗算し、その値を「x」に代入する。
x /= y; 「x」の値を「y」の値の分だけ除算し、その値を「x」に代入する。
x %= y; 「x」の値を「y」の値の分だけ割った余りを「x」に代入する。
x &= y; ANDゲートを「x」と「y」に使用し、その結果を「x」に代入する。
x |= y; ORゲートを「x」と「y」に使用し、その結果を「x」に代入する。
x ^= y; XORゲートを「x」と「y」に使用し、その結果を「x」に代入する。
x <<= y; 「x」の値を「y」の回数だけ左へビットシフトし、その結果を「x」に代入する。
x >>= y; 「x」の値を「y」の回数だけ右へビットシフトし、その結果を「x」に代入する。
x++; 「x」の値に1だけ加算する。
x--; 「x」の値から1だけ減算する。
if (n == x) {
Pass();
} else {
Strike();
}
「n」の値が「x」の値と等しい場合、モジュールは解除される。 そうでない場合、モジュールにミスが記録される。

正確には、Pass();GetComponent<KMBombModule>().HandlePass();Strike();GetComponent<KMBombModule>().HandleStrike();にするべきである。

付録 LogicBits: 論理ゲート、ビットシフト、2の補数

このモジュールに使用されているすべての数字は、32ビット整数である。32ビット整数は、32ビットで構成され、 それぞれのビットは1もしくは0となる。 32ビット整数の値は2147483647から-2147483648の範囲内となる。 値が最大値を超える、もしくは最低値を下回る場合、最低値もしくは最大値へ一周する。

2の補数:

負の数が使用された場合、値を二進数に変換し、すべてのビットを反転させる (すべての0を1にし、その逆も同じ)。そして、演算を始める前に1を足す。 32ビットすべてを使用するのは煩雑であるため、 その数字を表すのに必要なビット数に1を足した分の数のビットを使用するのをおすすめする。

論理ゲート:

値に論理ゲートを使用するには、値を二進数に変換し、下記の一覧を参照しながら、二つの値の各桁に対して 順番に演算する。その後、結果を十進数に変換する。

  • 0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1
  • 0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
  • 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

ビットシフト:

ビットシフトとは、二進数のビットを左、もしくは右へ、桁を一定回数動かすことである。 左へ一回シフトさせることは、値を二倍にするのと同義であり、 右へ一回シフトさせることは、値を半減させるのと同義である。

左へシフトさせると、移動させた桁数だけ最下位桁に0が追加される。右へシフトさせると、移動させた桁数だけ、最上位桁に元の最上位桁と同じビットが追加される。両方の場合でも、32ビットの範囲に収まらないビットは「削除」される。 シフト演算子の右側には0から31の数字しか入れることが出来ないため、 32で割った余りを入力して範囲内に収まるようにする。

Modulo:

modulo演算の出力の符号ビットはmodulo記号の前の数字の符号ビットと常に等しく、 記号の後の数字の符号ビットは無関係である。