1. 程式人生 > 其它 >位運算騷操作

位運算騷操作

bit operations

  • /2, *2

  • odd or even

  • 實現mod

    當計算\(a \mod b\) 且 b是\(2^n\)時,可以直接使用\(a \& (b-1)\)來計算\(a \mod b\)​。

    原理為:$a \mod b \(是\)a/b$​的餘數。

    因為\(b=2^n\),\(a/2^n\)又可以轉換為a=a>>n;

    所以$ a \mod b $​​ = a - (a//b)*b = \(a - (a//2^n)*2^n\)

    所以\(a \mod b\) = a - (a>>n)<<n

    又因為right shift是截斷的,所以(a>>n)<<n

    的結果是將a的低n位置0,記為\(a'\)

    所以\(a - a' = a + (-a') = a + ( \sim a'+1)\)

    • 關於\(a - a'\) = 低n位的推導

綜上,可以得到結論:這個低n位就是mod運算的結果(餘數)

所以,\(b-1=2^n-1\),二進位制表示為n-1位全1

所以,\(a\&(b-1)\)就是取a的低n位,就是餘數,即mod運算結果

  • 求商

    經過上面的推導,發現計算\(a \mod b\)\(b=2^n\)時,a的低n位是餘數,高m-n位是商。高m-n位是商的原因是:商應為\(a//b = a//2^n\) = a右移n位後的值,當a是正數時,符號位擴充套件一直是0,所以商是a的高m-n位。所以在這種情況下,求商的方法就是取a的高m-n位,之前取a的低n位操作是a&(b-1)

    ,那麼現在就是a&~(b-1)。這個操作可以在ispc的tutorial中看到:https://ispc.github.io/perfguide.html