データの退避を行わずに2値をswapする
別に探していた訳じゃないけれど,覚えておくといい気分になるかもしれん.アルゴリズムに関する質問、議論総合スレより.
501 名前: デフォルトの名無しさん 投稿日: 03/01/02 19:24 変数の中身を入れ替えるswapアルゴリズムに関してなんですが tmp変数を使わず実装することはできますか? 502 名前: デフォルトの名無しさん 投稿日: 03/01/02 19:26 余ってるレジスタ使えば可 503 名前: デフォルトの名無しさん 投稿日: 03/01/02 19:27 >>501 XOR や + - を使うやりかたの事? トリッキーなコード その2 の前スレに詳しいよ。 http://pc3.2ch.net/test/read.cgi/tech/1038215563/ 504 名前: デフォルトの名無しさん 投稿日: 03/01/02 19:49 #includemain(){ int a=2,b=5; printf("a=%d b=%d\n",a,b); a^=b; b^=a; a^=b; printf("a=%d b=%d\n",a,b); return 0; } 505 名前: 504 投稿日: 03/01/02 19:51 >>501 技術評論社「C言語による最新アルゴリズム事典」買え。
との事.
#include <stdio.h> int main(void){ int a=2,b=5; printf("a=%d b=%d\n",a,b); a^=b; b^=a; a^=b; printf("a=%d b=%d\n",a,b); return 0; }
VC8で試行すると確かにスワップされていた.注目すべきは演算子だろう.
^=
Assignment Operators: =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, and |=
Obtain the bitwise exclusive OR of the first and second operands; store the result in the object specified by the first operand.
違った.a^=b は a=a^b で,503の言うXORを利用してやってるだけだった.寝るときよく考えよう.