« April 2007 | Main

August 18, 2007

Bit演算子

誰も見てないだろうし、かなり放置気味だった。今回はビット演算をもう一度整理しておきたい。flashでビット演算が特別活躍する場もそう多くは無いが、使い方次第では今まで面倒だった処理が簡単に解決したりする。そもそもビットとは何か?
2進数とは何かを知らなければ始まらない。2進数とは一桁が1と0の数で成る数で0→1→繰り上がって0に戻るという繰り返しで成り立つ。一桁目が1までしか入らないので、一桁目で表現できる数は最大1となる。桁数をビット数といい2ビットで表現できる数は3となる。一桁目を0ビットと呼び、二桁目を1ビットと呼ぶ。


例えば、4ビットの1000という数は、3ビット目が1であるといえる。flashでは32ビットまで扱える。1000を0100に1を移動させると右側にそのまま移動したように見える。これをシフトという。シフトには右にシフトする場合は右シフトといい、左にシフトする場合は、左シフトという。それぞれ演算子>>と<<で行う。


ブール値とはtrue又はfalseを意味する。それぞれ1又は0という数値で表される。2進数表記であれば1桁で表現できることがわかる。4ビットであれば4つの桁があるので4つのブール値とみて扱うことも出来る。たとえば1111であれば4つのブール値がtrueであるという表現の代わりになる。このブール値を切り替える操作をtrueにする場合、falseにする場合、それぞれフラグを立てる、下ろすともいう。


OR演算子を使うとフラグを簡単に立てることが出来る。
0|=1;//結果1
1|=1;//結果1
は、1とOR演算を行うと必ず1となる。


XOR演算子を使うとフラグを入れ替えることが出来る。
1^=1;//結果0
0^=1;//結果1
当初1である数は0となり、0である数は1となる。


AND演算子を使うと、現在のビットと一致する部分だけが抽出できる。
1001&=0011//0001
下二桁を抽出した。上二桁は00であり、下二桁は01となった。
1001&=1100//1000
上二桁を抽出した。上二桁は10であり、下二桁は00となった。


ANDとNOT演算子を使うとフラグを下ろすことが出来る。NOT演算子は現在のビットの0と1を入れ替えるので0と~1は同じであるといえ、1と~0も同じである。
AND演算子は前後の値が共に1の場合に1となり、それ以外は0を返す。
1&=0;//結果0
0&=0;//結果0
となり、いずれの場合もフラグが下ろされる。これをNOT演算子を使って同様に表現すると
1&=~1;
0&=~0;
であり、いずれも同じ結果0を返す。これによりどちらもフラグを下ろすことが出来た。


XOR演算子は、データを暗号化できる。aをbを使って暗号化するとcが生まれる。
a^=b;//結果c
また、復号化も出来る。cに暗号化キーbを使ってXOR演算する。
c^=b;//結果a
しかし、c^=a;がbにあるので、暗号化キーがばれてしまうが・・。