[英]Should I check for parity of a number in a different way?
在 Java 以及其他語言中,我總是使用N % 2 == 0
技巧來獲得數字的奇偶性,但我很確定在時間復雜度方面有一些更好的解決方案。
使用N & 1 == 0
可能已經更好了,但這是否在恆定時間內運行,即它只是進行最右邊的位比較,還是完成所有組成 N 的 log(N) 位?
是否有可能以某種方式只讀取數字的最后一位,這肯定是恆定的時間?
通常, &
運算符在硬件電路中實現。 該電路在一個步驟中並行運行該數字的所有位。 它不會逐個查看。
另一方面,Integer 除法和余數運算要復雜得多。 流行的 CPU 沒有專門的電路,而是用微碼實現的。 很難找到主要來源,但互聯網上的不同來源將 integer 除法的成本約為AND
等按位運算符的 20-40 倍。
編譯器編寫者很清楚除法和余數指令的成本有多么昂貴,並盡一切可能避免生成使用這些指令的代碼 - 例如,參見為什么 GCC 在實現 integer 除法時使用乘以一個奇怪的數字? 很有可能,但不能保證N%2==0
被編譯為N&1==0
。 為了確保這一點,您必須檢查編譯器生成的機器代碼。 在Java中,你最應該關心的編譯器是JIT編譯器。 它即時生成本機機器代碼。 檢查其 output 是可能的,但並不容易。 此外,它所做的優化可能會從一個版本更改為下一個版本,或者因 CPU 型號而異。
如果您真的想知道在您的硬件應用中哪個更快,您應該創建一個基准測試並自己進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.