contributed by <huang-me
>
1
時,此兩數相加必定會進位,因此在計算平均時應該再將進位的 1
加回結果中。a & b
記錄的是兩數皆為 1
之 bit,也就是相加之後會進位之 bit。a ^ b
則記錄兩數相加之後不會進位之 bit-4(%rbp)
儲存 a
的值, -8(%rbp)
儲存 b
的值,%eax
、%edx
存計算中的暫時資料a
以及 b
右移一個 bit 之後再相加,最後計算 a & b & 1
再與之前的結果相加獲得最終結果-4(%rbp)
儲存 a
的值, -8(%rbp)
儲存 b
的值,%eax
、%edx
存計算中的暫時資料a & b
、 (a ^ b) >> 1
,最後再將結果相加獲得最終結果a < b
的結果值為 1
,同時 -1
在二補數中為 0b1111...1111
,因此無論跟什麼數值做 &
必定還是原數,而 a ^ (a ^ b) = b
。 a < b
的結果值為 0
,無論與什麼數做 &
其值必定維持為 0
,而得結果 a ^ 0 = a
。a < b
,而比較數值大小時如何看待給予的數值一開始定義輸入的形態時就已經決定,因此無論此數值是否為有號數依舊可以使用相同的想法__builtin_ctz
改寫 GCD__builtin_ctz
可以直接計算最後 0
的 bit 數,大幅減少了迴圈重複執行的次數。__builtin_ctz
後減少了大約一半的指令數量 。