2005-12-04

Binary2.0な小ネタ "排他的論理和でSWAP"

いやなブログ: Binary 2.0カンファレンス2005

Binary2.0ってのが最近注目されてるみたいです。これ関係の記事を読んでいて昔発見したテクニックを思い出したので,ちょっと書いてみます。上のイベントに参加している人とは全然レベルが違うネタですが。。。


例えばソートプログラムを書くときには二つの変数の内容を入れ替える(SWAPする)コードが必要になります。これってC言語を使うと,普通はこう書きますね。


int a = 12;
int b = 4;
int temp;

temp = a;
a = b;
b = temp;


まぁ,これでも良いんですが,tempって一時変数が邪魔ですよね。なんとか消すことは出来ないでしょうか?
実は出来ます。こんな風に書きます。


int a = 12;
int b = 4;

a = a^b;
b = a^b;
a = a^b;


知らない人は「???」って感じだと思いますけど,これを実行すると"a = 4, b = 12"になります。なぜかというと"^"で演算している排他的論理和の性質のおかげ。排他的論理和についてはWikipediaを参照。


これを発見したのは高校時代にアセンブラをいじってるときでした。見つけたときは「キタ━━━━(゚∀゚)━━━━ッ!!」って感じでしたが,あとで調べてみたらアセンブラ使いの間では常識的なテクニックだった模様(orz。


最近はJavaばっかり触っていてバイナリを意識することが無かったんですが,なんだか昔を思い出して懐かしかったので書いてみました(笑

0 件のコメント: