2013-02-01 66 views
5

我有要求做了多項的功能只有使用這些運營商的分配:高效地具有1全1一個int而且是一個0 0入住

! 〜&^| + < < >>

在有一些是有益的,使一些整數的問題,X,成爲全1是否含有1秒,但留0,如果是0。我之所以這樣做是這樣我就可以回Y或Z這樣的:

// One of the two conditional values is now 0 
int conditionalA = mask&y; 
int conditionalB = ~mask&z; 

// One of the values is combined with 0 using | 
int out = conditionalA|conditionalB; 

return out; 

在那裏我做了面具是這樣的:

// Make any x other than 0 all 1s 
int mask = x; 
mask |= mask>>1; 
mask |= mask>>2; 
mask |= mask>>4; 
mask |= mask>>8; 
mask |= mask>>16; 

mask |= mask<<1; 
mask |= mask<<2; 
mask |= mask<<4; 
mask |= mask<<8; 
mask |= mask<<16; 

必須有一個更好的方式做面膜所有的1或0,但我想不出一個更有效解。再次,這是很重要的0保持爲0如果x爲0

編輯:如果語句不是怎麼樣的選擇

+0

我猜你不能使用文字常量? – Jack

+0

我可以,但有進一步的限制(只允許寫入0x0 - 0xff之間的數字,如果他們需要更大的變化)。我不明白他們會如何幫助,雖然 – asimes

+1

看一下這個收集的位扭曲的黑客:http://graphics.stanford.edu/~seander/bithacks.html – vonbrand

回答

6

假設2的補:

int mask = !x + ~0; 

!映射任何非零值001,我們再加入~0-1)分別獲得-10

+0

這是完美的,謝謝 – asimes

+0

啊,以前好'int mask =!x +〜0;',我不能用 - – asimes

+0

@asimes是的,我應該放棄它!修正了,謝謝。 – ecatmur

3

x = (x | -x) >> 31; // Note this is implementation specific. 

好吧,我使用-這是不允許的,所以這裏不是正確的答案。我會把它留在這裏作爲一種新鮮事物。

+0

不行,對不對?如果x以'4'開頭,則以'0xfffffffc'結尾。 –

+0

@JerryCoffin:會的。這就是他使用'-'而不是'〜'的原因。 –

+0

@JerryCoffin不會是'0 | -0'這是'0 | 0'? – 2013-02-01 22:46:31

2

這裏是一個正在運行的,我認爲(假設兩個互補算術):

x = ~!!x + 1; 

我怎麼到那裏?

首先,!!x將任意非零值變爲1,並且0保持爲0.然後,對於否定-x = ~x + 1使用2的補碼等同性,presto!

+0

聰明,但另一部分任務是試圖習慣使用最少量的操作符,所以我將堅持'mask =!x +〜0;'。謝謝 – asimes

+0

如果你想少運營商,爲什麼不'mask =!x + 0xffffffff'?編輯:對不起 - 在上面的評論中沒有看到你的額外限制。 –

+0

另一個任意的規則是不能寫高於0xff的文字,否則會更好 – asimes

相關問題