我目前被困在一個需要撰寫的函式上,該函式檢查是否有任何偶數位設定為 1。例如,evenBit(0x1)回傳 1、evenBit(0x2)回傳 0 和evenBit(0xFFFFFFFF)回傳 1。目前我的evenBit()函式如下所示:
unsigned int evenBit(unsigned int x) {
unsigned int evenMask = 0x55555555;
return x & evenMask;
}
但是這些并沒有回傳我期望的結果,但我不完全確定如何解決這個問題。我想用掩碼隔離偶數位,我已經完成了,但我不確定如何處理結果以使其變為 1,而不使用 if 陳述句或任何其他不適合的運算子位操作,例如!=。
uj5u.com熱心網友回復:
從某種意義上說,您發布的代碼已經是正確的,evenBit如果設定了任何位,函式將回傳非零值 (true),否則回傳零 (false)。
如果要將回傳值限制為0and 1,則可以更改該行
return x & evenMask;
到:
return !!( x & evenMask );
這將應用邏輯非運算子!兩次。
邏輯非運算子將評估0其運算元是否為非零,以及1其運算元是否為零。因此,此操作為您提供與您想要的結果完全相反的結果。再次應用邏輯非運算子將為您提供所需的結果。
通常,程式員會寫
return ( x & evenMask ) != 0;
或者
return ( x & evenMask ) ? 1 : 0;
為了達到完全相同的結果,但這將違反您在僅使用按位和邏輯運算子的問題中所述的限制。
uj5u.com熱心網友回復:
根據要求僅使用按位運算子(和賦值),
x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
return x & 1;
與 OP 一樣,我假設x它是 32 位無符號整數,但不能保證。Anunsigned int可以更小或更大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410339.html
標籤:
上一篇:為什么malloc16位元組對齊
