位運算騷操作
阿新 • • 發佈:2021-12-20
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 - 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