データの退避を行わずに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
#include
main(){
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を利用してやってるだけだった.寝るときよく考えよう.