前回2進数とビット演算について検証をしてみた。
今回はビット演算の考え方をExcel関数の条件判定に使えないかと検証してみた。
sumproductの代替
パッと思いついたのがこれだ。
A列からC列はテーブルに変換している。
J列K列で名前定義をしている。
この名前定義で2進数の各ビットを表現している。
・性別が「男性」、出身が「兵庫」に一致するものを抽出
数式は以下のようになっています。
順に数式を追ってみます。
E列はBITAND関数。
まずはBITAND関数の第一引数部分。
INDIRECT(出身地[@性別])+INDIRECT(出身地[@出身])
これはこの数式を入力しているセルと同じ行にある、性別と出身を参照している。
データの一行目であれば「男性」と「大阪」です。
今回、「男性」と「大阪」は名前定義を行っているので
男性⇛1
大阪⇛4
と読み替えることができる。
次にBITAND関数の第二引数部分。
男性+兵庫
こちらも名前定義を行っているので、
男性⇛1
兵庫⇛8
と読み替えることができる。
上記の結果、以下の途中経過となる
BITAND(5,9)
以下は関数内の処理だが、
10進数が2進数に変換
BITAND(101,1001)
その後ビット演算を行い、
8 | 4 | 2 | 1 | |
---|---|---|---|---|
5 | 0 | 1 | 0 | 1 |
9 | 1 | 0 | 0 | 1 |
AND | 0 | 0 | 0 | 1 |
2進数の1が導き出され、最終的に10進数の1が返り値として表示されます。
同様の計算を各行に行ったものがE列に表示されている。
この中で言えば9と表示されている3行目が条件に完全に一致している。
sumproductの方がわかりやすい
どうにかビット演算を関数の条件判定に使えないかと試してみたが、出来上がった関数がわかりにくい。
同じ条件判定をsumproduct関数で表現してみると下記のようになる。
・sumproduct関数のほうがどのような判定を行っているかわかりやすい。
・sumproduct関数のほうが式が短い。
・BITAND関数は名前定義を行う前準備が手間。
・BITAND関数は条件との完全一致以外にも、部分一致も判定することができる。
ちなみにIF文だと下記のようになる
BITAND関数を条件判定に使用するなら、最後の部分一致ができる利点を活かすことになるのだろうか。
まとめ
そもそもビット演算のことがよくわかっていないとご指摘が飛んできそうな内容だが、気になったので自分なりに調べてみた。
何かのご参考になれば。