Following my previous question,我需要創建包括設置爲1的位的固體範圍的值I中使用下列的函數:設置一個位範圍中的序
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= ((1 << count) - 1) << first;
}
然而,如發現,它沒」 t對於count = 32
正確工作。的1 << count
在這樣的情況下結果理論上是未定義的行爲(或結果),和幾乎在x86是1,因爲換檔操作數處理的模數爲32
欲解決這個表達式爲正常工作這個極端的例子也是。什麼是最簡單/很好/有效的方式來做到這一點?
通過分支(if
,?
)處理這個特定的情況雖然很醜,但有點簡單,我敢打賭它也是低效的。
另一種方法是將移位操作數提升爲更大類型(64位)。我的意思是:
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= (UINT(unsigned __int64(1) << count) - 1) << first;
}
有沒有更好的方法?
爲什麼不使用'UINT(-1)'? – 2012-03-25 14:24:33
@Kerrek SB:怎麼樣? – valdo 2012-03-25 14:26:08
嗯。你可以添加一個簡單的,簡短的簡要描述你的函數所需的行爲嗎?我不希望從有問題的代碼中反向設計需求。 – 2012-03-25 14:27:40