C-Style の elseif 活用

状態がON/OFFの2通りを取得できるセンサを複数使う場合、

  • 1個だと ON/OFF の2通りの状態
  • 2個だと、(ON,ON)(ON,OFF)(OFF,ON)(OFF,OFF)の4通りの状態
  • 3個・4個は下の表参照(1=ON, 0=OFF)


とセンサが1つ増えるたびに全センサのON,OFFの状態の組み合わせは2倍づつ増えていく。


これを単純にifのセンサーチェックで判断すると、
▼1個の場合

▼2個の場合

▼3個の場合

▼4個の場合(下の画像2つ分)


とだんだん手に負えなくなる。


そこで、変数を導入し、それぞれのセンサのON/OFF値を0/1に置き換えて2進数で状態を表現する。

普段目にする金額などの10進数は0〜9までの10個の数字で1桁を表すが、 2進数は0と1の2つの数字で1桁を表す。
世の中には他にも、分と秒は60進数(60秒=1分、60分=1時間)、時間は24進数(24時間=1日)などの「進数」がある。

2進数と10進数をならべるとこのようになる。

ここで注目したいのは、2進数のうち桁中に「1」が1つだけ含まれる数値で、10進数では1,2,4,8,...と倍々に増えている。
2進数の1桁目をセンサ1、2桁目をセンサ2、3桁目をセンサ3、4桁目をセンサ4の状態として考えれば、状態を示す変数「A」を

  • センサ1がONなら1を足す(2進数の1)
  • センサ2がONなら2を足す(2進数の10)
  • センサ3がONなら4を足す(2進数の100)
  • センサ4がONなら8を足す(2進数の1000)

と変化させれば、全状態を一つの変数で網羅できる。


と、ここでこうプログラムすると、これは間違い。


(続く)