データの退避を行わずに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で試行すると確かにスワップされていた.注目すべきは演算子だろう.

^=
Obtain the bitwise exclusive OR of the first and second operands; store the result in the object specified by the first operand.

Assignment Operators: =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, and |=

違った.a^=b は a=a^b で,503の言うXORを利用してやってるだけだった.寝るときよく考えよう.