2013-08-23 47 views
0

我想如果EVAL 0和255之間的整數等於0或等於224爲此,使用位運算符

我有這樣的代碼:

if (!num || 224 == num) 

有沒有做一個方式這使用一些按位操作?

我試過了,我的有效期爲:0,31,32,63,64,95,96,127,128,159,160,191,192,223,224,255。顯然是不好的,因爲我只有需要0和224

!((num+1) & 30) 
+2

向我們展示您的嘗試。 – WhozCraig

+6

爲什麼?它已經在使用快速操作,更重要的是它是可讀的 –

+2

標準的地方去找點東西是[Bit Twiddling Hacks](http://graphics.stanford.edu/~seander/bithacks.html)。不過,我不確定它是否涵蓋這種情況。 –

回答

1

是返回true,輸入的範圍使其稍微容易。

您可以使用(x - 1) >> 31檢測x是否爲0(技術上不便攜,但是通常會工作)

它依賴於x永不已經小於0,並且,非便攜,對右移signed int是一個算術移位(通常是這種情況)。

同樣,你可以使用((x^224) - 1) >> 31檢測224

只是把它們放在一起這樣的:

int mask = ((x - 1) >> 31) | (((x^224) - 1) >> 31); 

而且你去那裏。

+0

非常感謝這麼多。有用。 – carlos

+1

@carlos你可能喜歡[接受這個答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work?answertab=votes#tab-top) –

-2
if (!num^0x3F) { 
    // a little less readable 
} 
+2

這對我不起作用。此程序:(!NUM^0x3F的)'的#include INT主(無效) { 對(INT NUM = 0; NUM <256 NUM ++) 如果 的printf( 「%d \ n」 個,NUM); return(0); }'列出所有256個數字0..255。如果表達式寫入'if(!(num^0x3F))',它只列出63. –

0

abs(2x-A) == A想到(其中A是你的224不變),但abs()很可能做一個比較內和減法很難位操作。你究竟想要做什麼,這是爲了速度還是隻是好奇心?

另一個想法是模x%A == 0,但是這也將爲A的倍數(448672,...)

+0

感謝您的回覆。好奇心是爲了找到更快捷的方式。 – carlos

+0

對不起,但我不明白,A是什麼? 2x是指2 *? – carlos

+0

您也可以在幾個按位操作中執行「abs」,順便說一句 – harold