2012-10-08 81 views
4

我已經在java代碼中看到了這個。Java簽名右移

int n = 300 //passed through a function 
size = (n + 31) >> 5 //size = 10 

5有什麼意義? 什麼是31 //應該是與INT大小(31位+ 1號)

由於

回答

6

5的意義在於,32 = 2^5的意義。

size = (n + 31) >> 5 

sizeceiling(n/32),其是用於存儲n比特標記需要32位整數的數目。

將31加到n的目的是確保股利至少與32的最小倍數大於或等於n一樣大。

+1

@TheZ這與它沒有多大關係。爲了便於理解,將其改寫爲:「(n + 31)/ 32」,意思是「獲得n/32的上限」 - 對於每個數字都可以正常工作,即'(n + x - 1)/ x'將是一般的解。轉移而不是分裂也混合在這裏,但是是一個單獨的話題,我認爲這裏已經有大多數人認識。 – Voo

+0

我認爲這不能比(n + 31)/ 32更有效率嗎? –

+0

@CoryKendall它可以,如果編譯器是愚蠢的。但是,因爲通常是一次性計算來查找所需數組的大小,所以沒有真正的理由這樣做,除了太習慣於進行位混合操作。 –