圖片來源: matheusrumetna.com
在寫LeetCode p078_Subsets 的時候,遇到分辨數字為奇數或偶數的情況,看到別人使用 &1
而不是習慣用的 %2
,特別將這點記錄下來。
%2
是我們最常使用的,是除以2後取餘數,如果餘數為0是偶數,1則為奇數。
但 &1 是藉由位元運算來判斷奇數偶數,因為偶數的最後一個位元為0,而奇數的最後一個位元為1,再來以int(32個位元)為例,因此 1 的二進位制是 0000 0000 0000 0000 0000 0000 0000 0001
,前31個位元都是0,AND後不管原本是什麼,都會變成0,所以重點就在最後一個位元。
如果N為偶數,那最後一個位元為0,AND後的結果為0,如以下例子:
N = ... 0110 = 6
... 0001 = 1
----------------- AND
... 0000 = 0
如果N為奇數,那最後一個位元為1,AND後的結果為1,如以下例子:
N = ... 0111 = 7
... 0001 = 1
----------------- AND
... 0001 = 1
結論是AND結果為0,N為偶數;AND結果為1,N為奇數。
在C++裡 0 被視為 False
,0 以外的數字被視為 True
,所以可以透過 if 來分別做不同的處理哦!
電腦在做AND運算理論上是比除法取餘數來的快,所以 &1
應該會比 %2
來的快。
如果喜歡這篇文章,請訂閱我並且拍五下手給予回饋(使用Google或Facebook帳號免費登入,只需要30秒),資金由LikeCoin提供,完全不會花到各位半毛錢!
因為您的支持,我才更有動力創作出更優質的文章~
留言
張貼留言