[英]Why does this code generate all 1s in the result instead of a mixture of 0s and 1s?
[英]Efficiently make an int that has a 1 all 1s but one that is 0 stay 0
我有一個任務,要求只使用這些運算符執行許多功能:
! 〜&^ | + << >>
在一些問題中,如果它包含任何1,則使一些整數x變為全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,但我想不出更有效的解決方案。 同樣,如果x為0,則0保持為0非常重要。
編輯 :如果語句不是一個選項
假設2的補碼:
int mask = !x + ~0;
的!
將任何非零值映射到0
和0
到1
,然后我們添加~0
( -1
)分別得到-1
和0
。
怎么樣:
x = (x | -x) >> 31; // Note this is implementation specific.
好的,我正在使用-
這是不允許的,所以這不是正確的答案。 我會把它留在這里作為新奇事物。
這是我認為的工作原理(假設是兩個補碼算術):
x = ~!!x + 1;
我是怎么到那兒的?
首先, !!x
將任何非零值變為1,0保持為0.然后,使用2的補碼等價來否定-x = ~x + 1
,presto!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.