6

符号なし文字の逆マスクを計算したいのですが、元のマスクが0xc0の場合、逆マスクは0x3fである必要があります。つまり、すべてのビットが反転または反転されている必要があります。以下を試しましたが、表示されません。働くこと。

int flipBit(int x, unsigned char position)
{
  int mask = 1 << position;
  return x ^ mask;
}

int main(int argc , char* argv[])
{
        uint8_t mask = 0x03;
        uint8_t inverse_mask = 0;
        uint8_t temp = 0;
        int loop = 0;

        for (loop = 0; loop < 8 ; loop ++)
        {
                temp = flipBit(mask,loop);
                inverse_mask |= temp;
        }
        printf("mask 0x%x inv mask 0x%x \n",mask,inverse_mask);
        return 0;
}

私が得る結果はマスク0x3invマスク0xffです

コードにバグが見つからないようです。

4

5 に答える 5

7

なぜあなたはこれをすることができないのですか?

uint8_t mask = 0x03;
uint8_t inverse_mask = ~mask;
于 2011-11-04T01:50:54.103 に答える
6

〜(ビット単位ではない)演算子を使用します。

inverse_mask = ~mask;
于 2011-11-04T01:52:29.733 に答える
3

あなたがそれをすることができる多くの方法があります。

このバイナリ値があるとしましょう:

x = 01110110

人間として、私たちはそれが「逆」であると特定することができます:

y = 10001001

それでは、そのプロパティを見てみましょう。

  • のすべてのビットyは、の対応するビットではありませんx
    • この操作は、次のようにCで実行されます。y = ~x;
    • あるいは、1ビットのxor 1はそのビットを与えないことがわかっているので、y = x^0xFF;
  • 任意のビットとそのnotの合計は、キャリーなしで1です。したがってy+x == 0xFF
    • したがって、y = 0xFF-x;

プログラムが機能しない理由については、ループをたどってみましょう。

loop: 0
  mask:         0000 0011
  temp:         0000 0010
  inverse_mask: 0000 0010
loop: 1
  mask          0000 0011
  temp          0000 0001
  inverse_mask: 0000 0011
inverse_mask eventually: 0xFF

あなたは最初のループで問題を見ることができました:あなたはあなたがinverse_mask持ってはいけないものの2番目の場所で問題を手に入れました。

temp反転されたビットのみを保持したい場合は、次flibBitの代わりに、を書き込む必要があります。

return x ^ mask;

この行:

return (x & mask) ^ mask;

そのため、最初にビットを分離してから、それを反転します。

プログラムのエラーを学習するために説明したので、最初に説明した方法の1つを使用する必要があります。

于 2011-11-04T02:06:49.553 に答える
1

これは、XORを使用して行うのは非常に簡単です。

uint8_t mask = 0x03;
uint8_t inverse_mask = mask ^ 0xFF;
于 2011-11-04T01:52:26.263 に答える
1

あなたのflipBit関数はあなたのコードが機能するためにせいぜい1ビットだけを返すはずです:

0x03 ^ 0x01 = 0x02
0x03 ^ 0x02 = 0x01
0x03 ^ 0x04 = 0x07
0x03 ^ 0x08 = 0x0b
0x03 ^ 0x10 = 0x13
0x03 ^ 0x20 = 0x23
0x03 ^ 0x40 = 0x43
0x03 ^ 0x80 = 0x83
0x2 ^ 0x1 ^ 0x7 ^ 0xb ^ 0x13 ^ 0x23 ^ 0x43 ^ 0x83 = 0xff

int flipBit(uint8_t x, unsigned char position)
{
  int mask = 1 << position;
  return (x & mask) ^ mask;
}
于 2011-11-04T02:02:44.327 に答える