2010-04-14 51 views
1

我想找到一个公式来描述这个系列。 我需要根据正整数设置一个布尔值。 这很简单,但我卡住了,感觉有点愚蠢。如何在代码中描述这个系列?

0 false 
1 true 
2 true 
3 false 
4 false 
5 true 
6 true 
7 false 
8 false 
9 true 
10 true 
11 false 
12 false 
... 

所以在每个奇数

回答

5

嘛标志变化,为旗在每个奇数改变,它看起来像你的布尔应该是真实的,当且仅当(n+3)%4 <= 1,其中%是模运算符:

n (n+3)%4 Boolean 
-- ------- ------- 
0  3  false 
1  0  true 
2  1  true 
3  2  false 
4  3  false 
5  0  true 
6  1  true 
7  2  false 
8  3  false 
9  0  true 
10  1  true 
11  2  false 
12  3  false 
::  :  : : 

我特意增加了三个,而不是减去一个,因为某些语言有模运算符应为负数做什么不同的想法。请记住,这是与语言无关的。如果您专门寻找C或C语言解决方案,请参阅优秀答案here from Christoffer Hammarström(n + 1) & 2以防万一它消失) - 这在这些特定语言中要简洁得多。

+0

'(n + 1)&2'似乎更简单,不是吗? – 2010-04-14 09:44:50

+0

其实这是一个很好的答案。我更喜欢数学方面的知识,因为没有指定语言,但对C和它的弟兄来说这确实相当不错。我怀疑他们可能会根据现在聪明的编译器如何优化到同样的东西(但我无法确定)。 – paxdiablo 2010-04-14 11:36:20

2

您可以先将int值除以2,然后检查它是偶数还是奇数。

boolean flag = ((i+1)/2)%2!=0; 

也许有一个错误的错误,所以检查一下。

N (N+1)/2 ((N+1)/2)%2 compare != 0 
0  0   0   false 
1  1   1   true 
2  1   1   true 
3  2   0   false 
4  2   0   false 
5  3   1   true 
6  3   1   true 
7  4   0   false 
8  4   0   false 
9  5   1   true 
... 
0

在每个奇数标志的变化,意味着最后一个比特设置为1。

1 => 01,3 => 11,... 9 => 1001,11 => 1011 等等.. 所以,你可以检查每一步的最后一位,每当它是1时,翻转标志。

3

在C和其他语言中,非零值为真:(n + 1) & 2和其他语言:(n + 1) & 2 != 0

+1

灵活+1。 – paxdiablo 2010-04-14 11:42:31