3

我在java中遇到了这段代码,如果有人可以向我解释逻辑,我会很高兴。

public boolean name(int n) {
   return ((n >> n) & 1L) > 0; 
}

我猜这是一种检查操作,但此代码将返回什么布尔值。是否有替代此代码的方法。我正在尽我所能理解java中的位操作。

4

4 回答 4

7

这是一段奇怪的代码。它检查n已右移位的数字是否n % 32为奇数。

通过的第一个非负值是 37(二进制 100101)、70(二进制 1000110)和 101(二进制 1100101)。

我怀疑它实际上是否像原始编码器所期望的那样工作 - 它显然没有表示任何有用的东西(并且方法名称name非常无用......)

于 2012-08-10T11:36:40.850 回答
1

对于正数,如果一个数字的形式为,该函数似乎返回 true:

sum_k (alpha_k * 2^k + d(k)), where 

alpha_k = 0 or 1
k >= 5
d(k) = k for exactly one of the k where alpha_k = 1 and 0 otherwise

例子:

alpha_k = 1 for k = 5, 0 otherwise => 32 + 5 = 37
alpha_k = 1 for k = 6, 0 otherwise => 64 + 6 = 70
alpha_k = 1 for k = 5 and 6, 0 otherwise => 32 + 5 + 64 = 101
                                         or 32 + 64 + 6 = 102

等等

所有这些数字都将起作用:

将该数字本身移动 % 32 将其移动 d(k) 对于不为空的 k。
到达位置 1 的位在位置 k 中,定义为 1 (alpha_k = 1)

证明只有这些数字有效更具挑战性......

下一个问题显然是:有什么意义?!

于 2012-08-10T12:10:49.850 回答
1

也许这个谜题的目的是看看您是否会考虑将 0 位之外移到 31 位以及会发生什么。

负数变得更加奇怪。

for(int n=-70;n<=200;n++)
    if (((n >> n) & 1L) > 0)
        System.out.print(n + " ");

印刷

-70 -69 -68 -67 -66 -65 -58 -57 -56 -55 -54 -53 -52 -51 -50 -49 -48 -47 -46 -45 -44 -43 -42 -41 -40 -39 -38 -37 -36 -35 -34 -33 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 37 70 101 102 135 165 167 198 199

一个类似的公式 whennint

n & (1 << (n & 31)) != 0

如果nlong

n & (1L << (n & 63)) != 0

更多的负数在移位后有 1 组,因为它们得到符号扩展。

类似的谜题

http://vanillajava.blogspot.co.uk/2012/01/another-shifty-challenge.html

http://vanillajava.blogspot.co.uk/2012/01/shifting-challenge.html

于 2012-08-10T11:56:30.047 回答
0

>>是有符号右移运算符,左操作数是要移位的整数,右边是要移位整数的位数。最终& 1L操作测试第 0 位:如果第 0 位为 1,则函数返回 true。我不知道这样做的真正目的,但此函数返回 true 的结果集取决于操作数大小,例如对于 32 位 int 片段(n >> n)返回 32 的倍数的非零结果,然后 ...

32:   (n>>n): 32   (n>>n)&1L: 0
33:   (n>>n): 16   (n>>n)&1L: 0
34:   (n>>n): 8   (n>>n)&1L: 0
35:   (n>>n): 4   (n>>n)&1L: 0
36:   (n>>n): 2   (n>>n)&1L: 0
37:   (n>>n): 1   (n>>n)&1L: 1

or

192:   (n>>n): 192   (n>>n)&1L: 0
193:   (n>>n): 96   (n>>n)&1L: 0
194:   (n>>n): 48   (n>>n)&1L: 0
195:   (n>>n): 24   (n>>n)&1L: 0
196:   (n>>n): 12   (n>>n)&1L: 0
197:   (n>>n): 6   (n>>n)&1L: 0
198:   (n>>n): 3   (n>>n)&1L: 1
199:   (n>>n): 1   (n>>n)&1L: 1
于 2012-08-10T11:56:24.867 回答