簡體   English   中英

我應該以不同的方式檢查數字的奇偶性嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM