bit演算の考え方を応用して大量のチェックボックスを管理する

こんにちはアシアルの岡本です。

暖かい日が多くなりましたが、桜はもう散り際ですね。
週末は車や電車の窓から桜をみながら、
秩父へ1泊二日の小旅行へ行ってまいりました。

たまにはパソコンから離れて自然に囲まれることも必要です、
常に鞄の中にはノートパソコンと通信カードが入っているのですが…

今日はHTMLフォームのチェックボックスを扱うテクニックの紹介をしたいと思います。
大量のチェックボックスの情報をGETリクエストで引き回したり、
データベースに格納するのは一苦労ですがbit演算の考え方を応用すると上手く解決する場合があります。

各チェックボックスをbit演算に見立て桁を割り当てることで、
32ビットなら最大32個、64ビットなら最大64個の情報を一つの数値型に格納することができます。

数に上限があるため用途は限られますが、
例えば、ネットショップで商品毎に色を持たせたい場合に使ったことがあります。

色値
0 1 ブラック
1 2 ホワイト
2 4 レッド
3 8 グリーン
4 16 ブルー
5 32 シアン
6 64 マゼンダ
7 128 イエロー
8 256 シルバー
9 512 ゴールド

割り当てた桁の値で2の乗数を求めることで色の値が作れます。
また、色の値を加算することで、複数の色が選択された状態を表現できます。

例えば、
・赤色と黒色のチェック柄のスカートは


2^0 + 2^2 = 1 + 4 = 5

で色状態5になります。
・銀と金の指輪で緑の石がはめ込まれている場合は、


2^8 + 2^9 + 2^3 = 256 + 512 + 8
= 776

となり、色状態は776になります。
・因みに全ての色を使っている場合は


2^10 - 1 = 1023

になります。
カンマ区切りで全色列挙すると、
0,1,2,3,4,5,6,7,8,9
19バイトの文字列になるのでだいぶ節約できますね。

RDB(今回はPostgreSQL)から該当する赤色を使っている商品を探す場合は以下の通りになります。


postgres=# select * from test_item where color = color | 4 ;
id | name | color
----+--------------------+-------
1 | チェックのスカート | 5
3 | 色が色々ある何か | 1023

金と緑を使っている商品を探す場合は以下の通りです。


postgres=# select * from test_item where color = color | 520;
id | name | color
----+------------------+-------
2 | ペリドットの指輪 | 776
3 | 色が色々ある何か | 1023

この方法の問題は、bit演算に馴染みがない人には分かりにくい点や、
チェックボックスの数に上限があることですが、
特定の状況下においては、高速かつ少ないデータ量で情報を扱うことができます。