4

割り当て/プロジェクトで、ビットシフト論理演算子のみを使用して符号なし整数に 1 を加算する質問があります。関数内に「+」、「-」、「*」、または「/」記号を含めないでください。

私は先日から試していますが、まだ成功していません。これまでのところ、次のことを試しました。

int A = (((B&C)<<1)^(B^C))

誰でもこれを解決するのを手伝ってもらえますか?

あなたはどんなプログラミング言語でも私を助けることができます.

4

6 に答える 6

17
unsigned int i = ...;
unsigned int mask = 1;
while (i & mask)
{
    i &= ~mask;
    mask <<= 1;
}
i |= mask;
于 2012-08-21T12:56:50.730 に答える
8

ジャワ:

public static int inc(int i){
        if ((i & 1) == 0)
            return i | 1;
        else 
            return inc(i>>1)<<1;
    }

PS while loop バリアント by henrikは明らかに高速です

于 2012-08-21T12:58:52.590 に答える
3

これを試してください:

int n = 3;
n = abs(~n);
std::cout << n;

~n = -(n+1)[~はビット単位の補数です]。(n + 1)2 の補数変換で 1 を加算したためです。

(x + 1)もう一度適用否定を取得するには。したがって、最終的な式は になりabs(~x)ます。

于 2019-12-23T09:52:01.570 に答える
0

算術演算子を使用せずに数値をインクリメントするロジック( +, -. * and /)

unsinged int no = 3; //actual number
unsigned int one = 1;
unsigned int ans = 0;
unsigned int carry = 0;
unsigned int prev_ans = 0;
unsigned int prev_carry = 0;

ans = no ^ one;
carry = no & one;

while (carry != 0)
{
   carry <<= 1;

   prev_ans = ans;
   prev_carry = carry;

   ans = prev_ans ^ prev_carry;
   carry = prev_ans & prev_carry;
}
于 2012-08-21T13:07:51.367 に答える
0

Google でFull Adderを探し、実装してみてください。

于 2012-08-22T07:28:17.080 に答える
-2

これは簡単すぎます。たとえば、Haskellでは次のようになります。

data Unsigned = Zero | Succ Unsigned
increment :: Unsigned -> Unsigned
increment u = Succ u

ビット演算子や算術演算子はありません。演算子はまったくありません。

于 2012-08-21T22:52:39.310 に答える