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

dej*_*jay 4 c math integer numbers modulus

以下列方式很容易在0和1之间"切换":

 int i = 0;
 i = (++i) % 2; // i = 1
 i = (++i) % 2; // i = 0
Run Code Online (Sandbox Code Playgroud)

同样,我发现可以在3到5之间"切换":

 int i = 3;
 i = (((i * 2) - 1) % 3) + 3; // i = 5
 i = (((i * 2) - 1) % 3) + 3; // i = 3
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ung 12

矮得多:

int i = 3;
i = 8 - i;
i = 8 - i;
Run Code Online (Sandbox Code Playgroud)

当然,对于你的0/1切换,你应该这样做:

int i = 0;
i = 1 - i;
i = 1 - i;
Run Code Online (Sandbox Code Playgroud)

通常,对于a/ btoggle,执行以下操作:

int i = a;
i = (a + b) - i;
i = (a + b) - i;
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?嗯,a + b - ab,a + b - b是的a.:-D


1''*_*1'' 9

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

int i = 3;
i ^= 3 ^ 5; // i == 5
i ^= 3 ^ 5; // i == 3
Run Code Online (Sandbox Code Playgroud)

  • 这实际上比使用sum更好,因为它不会溢出(或下溢).它也是一种标准的位级技巧,可用于大量其他......位级技巧. (2认同)