如何简化我的“等式”以在3和5之间切换?

时间:2013-08-23 03:52:03

标签: c math numbers integer modulus

以下列方式很容易在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

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

5 个答案:

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

答案 1 :(得分:9)

另一种方法是使用XOR,因为a ^ (a ^ b) == bb ^ (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

要在两个数字ab之间切换,您需要常量值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));
    }
}

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