簡體   English   中英

有效地創建一個具有1全1但一個為0的int保持為0的int

[英]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;

! 將任何非零值映射到001 ,然后我們添加~0-1 )分別得到-10

怎么樣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM