2

aを、b異なる値を持つ正の整数とします。これらの式を単純化する方法はありますか:

bool foo(unsigned a, unsigned b)
{
    if (a % 2 == 0)
      return (b % 2) ^ (a < b); // Should I write "!=" instead of "^" ?
    else      
      return ! ( (b % 2) ^ (a < b) ); // Should I write "(b % 2) == (a < b)"? 
}

戻り値をブール値として解釈しています。

4

5 に答える 5

5

とどう違うの?

 (a%2)^(b%2)^(a<b)

これは順番に

 ((a^b)&1)^(a<b)

または、実際に

 ((a ^ b) & 1) != (a < b)

追加するために編集:もう少し考えてみると、これは(a-b)(2 の補数を使用する場合) の最初と最後のビットの xor にすぎないため、回転命令を含む、より高速なマシン固有の ASM シーケンスが存在する可能性があります。

于 2012-11-06T20:29:48.610 に答える
2

経験則として、異なる演算子ファミリの演算子を混在させないでください。リレーショナル/ブール演算子とビット演算子、および通常の算術を混合しています。

これはあなたがやろうとしていることだと思いますが、私はあなたのコードの目的を理解していないのでわかりません。それは読みやすく、自明でもありません。

bool result;
bool a_is_even = (a % 2) == 0;
bool b_is_even = (b % 2) == 0;

if (a_is_even == b_is_even) // both even or both odd
  result = a < b;
else
  result = a >= b;

return result;
于 2012-11-06T20:46:13.367 に答える
1

ブール値である真理値を返す場合、提案された変更はコードのセマンティクスを変更しません。これは、ビットごとの XOR が真のコンテキストで使用される場合、 と同じであるため!=です。

私の見解では、提案された変更により、コードがはるかに理解しやすくなります。著者がビット単位の XOR が適切であると考えた理由はよくわかりません。そのようなコーディングは賢いと考える人もいると思います。私はしません。

2 つのバージョンの相対的なパフォーマンスを知りたい場合は、プログラムを作成し、その差を測定します。それらの違いを測定できるとしたら、私は驚かれることでしょう。これらのコード行がパフォーマンスのボトルネックだったとしたら、私も同様に驚くでしょう。

于 2012-11-06T20:30:36.210 に答える
1

私はC#でプログラミングしていますが、次のようなことを考えています:

return (a % 2 == 0) && ((b % 2) ^ (a < b))

「^」は「==」と同等であるというコメントを考慮して

于 2012-11-06T20:33:49.400 に答える
0

この問題に関する情報はあまりないため、次のことを試してください。

int temp = (b % 2) ^ (a < b);
if (a % 2 == 0)
  return temp;
else      
  return !temp;  

コンパイラがまだ最適化していない場合、これはより少ないコードになるはずです。

于 2012-11-06T20:58:34.080 に答える