命令を実行するたびに2つの値を変数に切り替える単一の命令を記述したいと思います。これは一般的なケースです。2つの値がx1, x2
あり、またはにi
初期化されている場合、命令の実行ごとにi値を切り替えます。つまり、iがx2に初期化されている場合は、x1
x2
x1
x2
i= x1, x2, x1 ...;
i = x2, x1, x2, ...;
たとえば、0と1を切り替えます。i= 3 % (i+2);
x1, x2
一般的なcase命令を作成するにはどうすればよいですか?
命令を実行するたびに2つの値を変数に切り替える単一の命令を記述したいと思います。これは一般的なケースです。2つの値がx1, x2
あり、またはにi
初期化されている場合、命令の実行ごとにi値を切り替えます。つまり、iがx2に初期化されている場合は、x1
x2
x1
x2
i= x1, x2, x1 ...;
i = x2, x1, x2, ...;
たとえば、0と1を切り替えます。i= 3 % (i+2);
x1, x2
一般的なcase命令を作成するにはどうすればよいですか?
これはあなたが探しているものですか?
i=(x1+x2)-i
ビット演算は非常に高速なので、整数変数であれば、
type z = x1 ^ x2, i = x1;
// do something
while(...) {
i ^= z;
// ...
}
XOR は高速なソリューションです。
その背後にある秘訣は、XOR が結合的かつ交換可能でありx ^ x == 0
、.x
0 ^ x == x
だからいつi == x1
、
i ^= z ~> i = x1 ^ (x1 ^ x2) ~> i = (x1 ^ x1) ^ x2 ~> i = 0 ^ x2 ~> i = x2
および wheni == x2
のx2
s はx2 ^ (x1 ^ x2)
キャンセルします。
たくさんの議論を通して、私はついにあなたが必要としているものに気づきました:)
これが私のソリューションのコードサンプルです:
#define x1 7
#define x2 11
int main(void )
{
int a = 0;
int val = x1;
int xorFactor = x1^x2;
printf("\n");
for (a=0; a<10; a++) {
val = val^xorFactor;
printf("%d: %d\n", a, val);
}
return 0;
}
おそらく、次のような単純なもの
i = (i==x1)?x2:x1;
トリックを行います