3

宿題を少しいじる最後の問題で問題が発生しています。奇数ビットが1に設定されている場合、関数は1を返すことになっています。これまでのところ、次のようになっています。

int anyOddBit(int x) {
    return (x & 0xaaaaaaaa) != 0;
}

これは完全に機能しますが、これほど大きな定数を使用することは許可されていません(0から255、0xFFのみ許可されています)。私も使用できません!=

具体的には、これは私が使用することに制限されているものです:

  Each "Expr" is an expression using ONLY the following:
  1. Integer constants 0 through 255 (0xFF), inclusive. You are
      not allowed to use big constants such as 0xffffffff.
  2. Function arguments and local variables (no global variables).
  3. Unary integer operations ! ~
  4. Binary integer operations & ^ | + << >>

私はそれらの制限の中でこれを行う方法を理解することができません、そして誰かが私を正しい方向に向けることができれば本当にありがたいです。前もって感謝します!

4

3 に答える 3

4

ANDの前にORを実行できます。

((x>>0) | (x>>8) | (x>>16) | (x>>24)) & 0xaa

最初のシフト(x >> 0)は最適化されます-それは一貫した外観のためにあります。

于 2012-04-23T01:02:21.337 に答える
3

次を使用できます。

!!((   ( x        & 0xff)
     | ((x >>  8) & 0xff)
     | ((x >> 16) & 0xff)
     | ((x >> 24) & 0xff)
) & 0xaa)

各ソースオクテットをOR演算する「内部」ビットは、同等のビットがいずれかのソースオクテットに設定されている場合に各ビットが設定されるオクテットを提供します。したがって、奇数ビットの1つがソースオクテットに設定されている場合、それはターゲットオクテットにも設定されます。

次に、それを。と単純にAND0xaa演算することにより、奇数ビットが設定されていない場合はゼロ値を取得し、奇数ビットのいずれかが設定されている場合は非ゼロ値を取得します。

次に、0または1が必要であり、を使用できないため、2つの論理!=否定演算子を使用して同様の効果を得ることができます。与えると与える!!ので、それは機能します。!(any-non-zero-value)0!01


12個の演算子のみでそれを行うために(上記の私の元の解決策のように13個ではなく)、実際には必要ないので値のを削除できます& 0xff>> 24ゼロビットは左からシフトインされます):

!!((   ( x        & 0xff)
     | ((x >>  8) & 0xff)
     | ((x >> 16) & 0xff)
     | ((x >> 24)       )
) & 0xaa)

実際、それよりもさらにうまくいくことができます。ファイナル& 0xaaはとにかく上位24ビットをすべてクリアするので、& 0xffセクションは必要ありません(1行にも収まります)。

!!((x | (x >> 8) | (x >> 16) | (x >> 24)) & 0xaa)

これで、オペレーターは9人になります。

于 2012-04-23T01:32:16.707 に答える
1

0xaaaaaaaa基本的(0xaa << 24) | (0xaa << 16) | (0xaa << 8) | (0xaa)には、それは許されますね。

于 2012-04-23T01:02:37.190 に答える