我正在使用僅使用二元運算符的方式來劃分2的冪整數的有符號整數(< < >> + ^〜& |!),並且結果具有要繞到0.我也遇到了關於這個問題的Stackoverflow上的this question,但是,我不明白它爲什麼起作用。這裏的解決方案:除以2的冪的有符號整數
int divideByPowerOf2(int x, int n)
{
return (x + ((x >> 31) & ((1 << n) + ~0))) >> n;
}
我明白x >> 31
部分(只添加下一個部分,如果x
是負的,因爲如果它的正面x
會自動向輪0)。但困擾我的是(1 << n) + ~0
部分。它如何工作?
二補。但是你是對的,答案並不能解釋任何事情。現在,當你這樣做的時候你會得到低估... –
'x +〜0'是寫'x-1'的有趣方式,它只是將該舍入掩碼截斷爲'n'位 – harold
1)關注除負數? 2)擔心可移植地劃分負數? 3)關心處理'x == INT_MIN'?4)滿足/超過'int'的位寬的2的冪數?否則,目標太狹窄了,除了可能性的狹窄概念或'int'的範圍和細節之外,它沒有用處。 – chux