2012-08-10 146 views
3

我在java中遇到了這段代碼,如果有人能夠向我解釋邏輯,將很高興。java位運算符

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

這是一種檢查操作我猜,但是這個代碼會返回什麼樣的布爾值。有沒有這個代碼的替代品。我正在盡力理解java中的位操作。

+0

看起來像我會寫成一個謎題的事情。我建議你嘗試不同的值,看看它做了什麼,並嘗試自己解釋它。 – 2012-08-10 11:46:29

+0

這是我會寫的東西;)http://vanillajava.blogspot.co.uk/2012/01/another-shifty-challenge.html – 2012-08-10 11:48:10

+0

@PeterLawrey你能找到這個封閉的公式嗎? (即n必須爲n = ...) – assylias 2012-08-10 11:54:08

回答

7

這是一段奇怪的代碼。它檢查編號爲n,是否已經被移位了n % 32位,是否是奇數。

通過的第一個非負值是37(二進制100101),70(二進制1000110)和101(二進制1100101)。

我懷疑它的實際工作作爲原始編碼打算 - 它沒有明顯表示任何有用的東西(和name方法名是非常無益的...)

+0

101 => 102 ...... – assylias 2012-08-10 11:39:22

+0

@assylias:Nope。根據我的測試程序,101也通過了。 102也通過,但101通過,因爲當1100101b右移5位時,你得到11b。所以前三個值是37,70和101. – 2012-08-10 11:40:43

+0

糟糕,你是對的,'((n >> n)&1L)'對於101是3。 – assylias 2012-08-10 11:41:50

0

>>簽訂向右移位運算符,左邊的操作數是要移位的整數,右邊的是將整數移位的位數。最終& 1L操作測試第零位:如果第零位爲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 
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

nint

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

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 

所有這些數字將工作:

由d(k)的自身移動該號%32只將它不是空第k。
其移到位置1中的位是在位置k是1,定義(alpha_k = 1)

證明,只有那些數字工作更具挑戰性有點...

下一個問題是顯然:有什麼意義?