位數大是什麼?我不知道該方法如何工作,但我會認爲它在O(logn)中完成。Java - bitCount()的大O?
具體而言,此代碼(其中x = 4,Y = 1):
return Integer.bitCount(x^y);
位數大是什麼?我不知道該方法如何工作,但我會認爲它在O(logn)中完成。Java - bitCount()的大O?
具體而言,此代碼(其中x = 4,Y = 1):
return Integer.bitCount(x^y);
鑑於其實現方式中,方法包括六個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;
}
JVM可以自由地實現它與您在JDK源代碼中看到的代碼不同,事實上它自從它是一個「已知功能」。通常它會在支持它的平臺(大多數有趣的平臺)上編譯成單一的「popcnt」指令。雖然它確實意味着'Integer.bitCount()'和'Long.bitCount()'通常會花費同一時間 - 但如果您查看源代碼,這不會是您的結論。 – BeeOnRope
這是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;
}
實際上,這個實現並沒有被使用,因爲在大多數平臺上'Integer.bitCount'和'Integer','Long'等類中的幾個其他簡單方法被實現爲JVM內部函數,這些JVM內部函數通常會導致一個'popcnt' (1)雖然:) – BeeOnRope
這聽起來很合理,但你可以指向一些使用JVM intristics實現這個的源代碼(我發現源代碼正好使用粘貼的代碼)? – syntagma
是的,您已經深入研究了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
什麼'N'在'O(log n)的'?整數中的位總數是多少?當談論Big O時,我們設置了一些任意的操作來使成本爲1,並且可以公平地假設'bitCount'的成本爲1. – Mephy
其實我想它是'O(1)',參見例如。 https://stackoverflow.com/questions/1458314/number-of-1s-in-32-bit-number – jonrsharpe