4

通过以下方式可以很容易地在 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

虽然这感觉很麻烦,但我正在寻找一种更简洁的方法来做到这一点。可以简化吗?如果是这样,怎么做?顺便说一句,我实际上正在使用它。

4

5 回答 5

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 - aba + b - ba。:-D

于 2013-08-23T03:58:07.813 回答
9

另一种方法是使用 XOR,因为a ^ (a ^ b) == band b ^ (a ^ b) == a

int i = 3;
i ^= 3 ^ 5; // i == 5
i ^= 3 ^ 5; // i == 3
于 2013-08-23T04:04:53.153 回答
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
于 2013-08-23T03:56:07.767 回答
1

也更短:

i = 3;
i ^= 6; // now i = 5
i ^= 6; // now i = 3

a要在两个数字和之间切换b,您需要常量值a XOR b——第一个示例为 1,第二个示例为 6。

于 2013-08-23T14:37:57.167 回答
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));
    }
}

这种方法的好处是它也适用于任何长度的序列——不仅仅是在两个整数之间切换。

于 2013-08-23T04:12:50.240 回答