以下列方式很容易在0和1之间“切换”:
int i = 0;
i = (++i) % 2; // i = 1
i = (++i) % 2; // i = 0
同样,我发现可以在3和5之间“切换”:
int i = 3;
i = (((i * 2) - 1) % 3) + 3; // i = 5
i = (((i * 2) - 1) % 3) + 3; // i = 3
虽然这感觉很麻烦,但我正在寻找一种更简洁的方法来做到这一点。可以简化吗?如果是这样,怎么样?顺便说一下,我实际上是在用这个东西。
答案 0 :(得分:12)
更短:
int i = 3;
i = 8 - i;
i = 8 - i;
当然,对于你的0/1切换,你应该这样做:
int i = 0;
i = 1 - i;
i = 1 - i;
一般来说,对于a
/ b
切换,请执行以下操作:
int i = a;
i = (a + b) - i;
i = (a + b) - i;
这是如何工作的?好吧,a + b - a
是b
,a + b - b
是a
。 :-D
答案 1 :(得分:9)
另一种方法是使用XOR,因为a ^ (a ^ b) == b
和b ^ (a ^ b) == a
:
int i = 3;
i ^= 3 ^ 5; // i == 5
i ^= 3 ^ 5; // i == 3
答案 2 :(得分:3)
你可以说:
i = 3;
i = (i == 5) ? 3 : 5; // it's five now
i = (i == 5) ? 3 : 5; // it's three now
i = (i == 5) ? 3 : 5; // it's five again
答案 3 :(得分:1)
也短得多:
i = 3;
i ^= 6; // now i = 5
i ^= 6; // now i = 3
要在两个数字a
和b
之间切换,您需要常量值a XOR b
- 第一个示例为1,第二个示例为6。
答案 4 :(得分:0)
或者,或许更一般地,使用函数从顺序整数映射到任何重复的整数序列:
#include <stdio.h>
int mapModIntToSequence (int i, int mod, int x[]) {
return x[i%mod];
}
int main () {
int i;
int x[] = {2,7};
for (i = 0; i < 10; i++) {
printf ("%d\n",mapModIntToSequence(i,2,x));
}
}
这种方法有一个好处,它也适用于任何长度的序列 - 不只是在两个整数之间切换。