2017-05-29 67 views
0

位數大是什麼?我不知道該方法如何工作,但我會認爲它在O(logn)中完成。Java - bitCount()的大O?

具體而言,此代碼(其中x = 4,Y = 1):

return Integer.bitCount(x^y); 
+2

什麼'N'在'O(log n)的'?整數中的位總數是多少?當談論Big O時,我們設置了一些任意的操作來使成本爲1,並且可以公平地假設'bitCount'的成本爲1. – Mephy

+0

其實我想它是'O(1)',參見例如。 https://stackoverflow.com/questions/1458314/number-of-1s-in-32-bit-number – jonrsharpe

回答

4

鑑於其實現方式中,方法包括六個O(1)在序列進行語句,所以它的O(1) 。

public static int bitCount(int i) { 
    // HD, Figure 5-2 
    i = i - ((i >>> 1) & 0x55555555); 
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); 
    i = (i + (i >>> 4)) & 0x0f0f0f0f; 
    i = i + (i >>> 8); 
    i = i + (i >>> 16); 
    return i & 0x3f; 
} 
+0

JVM可以自由地實現它與您在JDK源代碼中看到的代碼不同,事實上它自從它是一個「已知功能」。通常它會在支持它的平臺(大多數有趣的平臺)上編譯成單一的「popcnt」指令。雖然它確實意味着'Integer.bitCount()'和'Long.bitCount()'通常會花費同一時間 - 但如果您查看源代碼,這不會是您的結論。 – BeeOnRope

1

這是O(1),這裏其JDK 1.5+實現:

public static int bitCount(int i) { 
    i = i - ((i >>> 1) & 0x55555555); 
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); 
    i = (i + (i >>> 4)) & 0x0f0f0f0f; 
    i = i + (i >>> 8); 
    i = i + (i >>> 16); 
    return i & 0x3f; 
} 
+0

實際上,這個實現並沒有被使用,因爲在大多數平臺上'Integer.bitCount'和'Integer','Long'等類中的幾個其他簡單方法被實現爲JVM內部函數,這些JVM內部函數通常會導致一個'popcnt' (1)雖然:) – BeeOnRope

+0

這聽起來很合理,但你可以指向一些使用JVM intristics實現這個的源代碼(我發現源代碼正好使用粘貼的代碼)? – syntagma

+1

是的,您已經深入研究了JVM的C++源代碼。要查看某個方法是否內在化,請查看[vmSymbols.hpp](http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/classfile/vmSymbols.hpp)對於您的JVM版本並查找函數名稱。在這種情況下,你可以找到一行,如'do_intrinsic(_bitCount_i,java_lang_Integer,bitCount_name,int_int_signature,F_S)',它表示該函數是_potentially_內部函數。 – BeeOnRope