« | »

11月29日 

未分類

ビット演算でフィルタリング

FizzBuzz問題くらい解けるんだろうなぁ?んん?

さて、書きためてた技術ネタを連投してみます。

意外(?)とウェブ系のインターフェース寄りプログラマになると(限定はできないけど)、ビット演算使ってゴニョゴニョって縁が遠いらしく。
ビット演算ってこんな感じ。こんな感じで使うのもありかもよ、というお話であります。

普段自分たちが使ってるのは10進数。コンピューターはByte=8bitなので8進数。さらにbitは2進数です。「コンピューターの世界は0か1だ!」みたいなのを10年以上前に聞いた気がしますw
たとえば10進数:6=2進数:110で、10進数:21=2進数:10101。(以後、2進数の後に(2)、10進数の後に(10)と書いておきます)

ここで、110(2)の1桁目に0を追加してみます。1100(2)ですね。これ、10進数で12(10)です。もう1個追加すると、11000(2)で、これは24(2)。2の”0を追加(左にシフト)した回数”乗の計算ができるんですね。
「何に使うねん」と言われそうですが、「8倍するならx=n*8よりx=n< <3の方が速い」と言われてた時代があったんですよ…

ちなみに逆は10101(2)→1010(2)=10(10)。2で割って余り切り捨て。

ま、こんな所でお腹いっぱいにならずに次に進んでみましょう。

ビット演算でよく出てくるのが「論理演算」ですね。ANDとかORとかXORってやつです。

まずはAND。論理積、というやつです。

0011010
0010110
0010010
上2行の論理積が3行目です。上と下、両方とも1のところが1になって、一方が0だと0。要は掛け算ですな。0に何掛けても0。1に1掛けりゃ1。

次、OR。論理和。

0011010
0010110
0011110
上2行の論理和が3行目で。上か下、どちらかが1なら1。1+0は1。0+0は0。1+1は2にはならないよ。2進数だもの。んで更に桁が上がるわけでも無いのです(0111010にはならないよ、と)。

最後。XOR。排他的論理和。

0011010
0010110
0001100
上2行の排他的論理和が3g(ry。0と0、1と1なら0で、0か1なら1。天の邪鬼、今風に言うならツンデレ。嫌よ嫌よも好きのうち(違)。

じゃ、この論理演算がどう役に立つのか、考えてみたいと思います(というかネタを用意)。

これで普通にチェック入れて送信すると「hoge[]=1&hoge[]=2&hoge[]=3&hoge[]=4…」てな感じで、受け取る側はhogeを配列として受け取れば言い訳なんですが。

例えばこれを

としておいて、チェック入ったときに
hoge = hoge | value
とすると、和食とフレンチなら101(2)で5(10)ですな。中華が追加になっても1101(2)で13(10)。
jQueryで書くなら

JAVASCRIPT:
  1. var ret = 0;
  2. $.each('input[name=hoge]', function() {
  3. ret |= $(this).val();
  4. }
  5. return ret;

てな感じで論理和で値をまとめることができます。

んで送られてきたシステム側は、論理積で抽出しちゃえばOK、という訳なのであります。
とはいえ、通常はvalueにはDBから取ってきた値を入れて、そのまま送り返しちゃえばいいだけなので、普通はこんな回りくどい使い方はしないですね…orz

やっぱり普通は画像の透過処理とかレジスタ操作とかですねー
ということでやっぱりWeb系ではなかなか使いどころが難しい、ということで。。。

コメント & トラックバック

自分は現在WPテンプレ職人ベクトルなんで こういう情報は助かりまふ・・・w
WPとりまく関連はバックグラウンド上においてダチに最近ケツ叩かれております(苦笑

どうやら、途中でおなか一杯になってしまいました(笑)
排他的論理和ってかな~り久しぶりに目にしました。。。

> まさん
WPはPHPが書ける人だといいけど、そうでなければMTの方が良い、とある人に言われました。
自分は前者なのでWPに特に不満はないのですけどね~
ま、ビット演算がWeb系でどこまで活用できるのかは未知ですが…orz

> やのすけさん
エントリ的にあまり読みやすくないので…orz
こういうのってWeb系のプログラミング講座では教えてくれなさそうですよね。

コメントフィード

コメント