3

ビット演算で次と前の偶数を決定しようとしています。

たとえば、次の関数の場合:

x    nextEven(x)
1       2
2       2
3       4
4       4

前の場合:

x    previousEven(x)
1       0
2       2
3       2
4       4

nextEven私は次のような関数のアイデアを持っていました:value = ((value+1)>>1)<<1;

そして、次のpreviousEvenような関数の場合:value = ((value)>>1)<<1

値が偶数か奇数かを比較して確認することなく、より良いアプローチはありますか?

ありがとうございました。

4

6 に答える 6

3

あなたはこのようなことをすることができます

前のイベント

unsigned prevev(unsigned x)
{
    return x-(x%2);//bitwise counterpart x-(x&1);
}

次回も

unsigned nxtev(unsigned x)
{
    return (x%2)+x; //bitwise counterpart x+(x&1);
}
于 2013-05-23T05:20:25.367 に答える
1

sを使用しているとしunsigned intます (値を一致させる - 2 の前の偶数を 0 にするかどうかなどについて議論することができます) は単純x & ~1uです。次の偶数は x + 1 の前の偶数です。

于 2013-05-23T05:06:56.107 に答える
0
unsigned int previous(unsigned int x)
{
    return x & 0xfffffffe;
}

unsigned int next(unsigned int x)
{
   return previous(x + 2);
}
于 2013-05-23T05:49:07.533 に答える