2012-04-05 93 views
9

所以我看到這個問題已經被問到,但是答案有點模糊和無益。好的,我只需要使用「& ^〜!+ | >> < <」使用按位運算符的條件語句

該表達式需要類似於:a? B:C

所以,從我已經能夠看出來,表達需要看起來像:

return (a & b) | (~a & c)

這個工作當a = 0,因爲用b安定它會給零,然後或表達式將返回右邊,(~a & c)這是可行的,因爲〜0給出所有的1,並且與所有1一起返回c。

但是,當a> 0時,這不起作用。有人可以試圖解釋爲什麼這是或者如何解決它?

回答

15

我會使用!!aa轉換爲布爾值,得到0或1. x = !!a

然後我會否定這個補碼。由於您沒有一元可用,您可以使用2的補碼取反的定義:反轉位,然後添加一個:y = ~x + 1。這將會清除所有位,或設置所有位。

然後,我會and,直接與一個變量y & b,它與其他反向:~y & c。這將爲其中一個表達式賦予0,另一個賦予其原始變量。當我們將or加在一起時,零點將不起作用,所以我們會得到原始變量,保持不變。

+0

這實際上是完美的。那麼爲什麼添加一個可以設置所有位或清除?我明白爲什麼需要這樣做,但我不明白這是怎麼發生的。 – atb 2012-04-05 19:22:11

+0

如果我們從0開始,那麼翻轉所有的位。當我們添加一個時,所有這些都變回零(並且進位被設置,但我們忽略它)。如果我們從1開始,翻轉這些位給出111 ... 10。添加1轉,持續0到1,所有的位現在是1。 – 2012-04-05 19:24:26

+0

'y =〜x + 1'部分讓我感到困惑;在x = 0的情況下,我終於認爲它的工作原因是整數溢出,但這並不明顯。 對我來說,更清晰的解決方案是首先將lsb移到msb左移(00000001 => 10000000),然後將msb右移: 'y =(x << 31) >> 31' – 2017-09-04 20:48:39

3

換句話說,需要a具有設置爲0的所有位,如果是false(即0),並已所有位設置爲1,如果a爲真(即a > 0)。

對於前一種情況,工作已經完成,對於後者 - 嘗試找出表達式~!1的結果。

+0

那麼這就是我第一次想到的。 〜!1會給所有完美的。但是,如果我要做〜!a和a = 0,那麼〜!0會給我1110,所以我不知道該從哪裏做什麼/: – atb 2012-04-05 19:13:26