0

C で論理式とビット単位の式をいじっていて、これらが正しいかどうか知りたいですか? x と y の乱数​​を選んで、紙のビットを調べました。

x=0xA5 and y=0x57
Expression  Value
  x & y     0x05
  x | y     0xF7
 ~x | ~y    0xF5
  x & !y    0x01
  x && y    0x01
  x || y    0x01
 ~x || ~y   0x01
  x && ~y   0x01
4

3 に答える 3

4
int main (void){
  int x = 0xA5;
  int y = 0x57;

  printf("%#x\n", x & y);
  printf("%#x\n", x | y);
  printf("%#x\n", ~x | ~y);
  printf("%#x\n", x & !y);
  printf("%#x\n", x && y);
  printf("%#x\n", x || y);
  printf("%#x\n", ~x || ~y);
  printf("%#x\n", x && ~y);
  return 0;
}

0x5
0xf7
0xfffffffa
0
0x1
0x1
0x1
0x1

短い答えです。いいえ、それらはすべて正しいわけではありません。なんで?

x = 0000 0000 1010 0101
y = 0000 0000 0101 0111

#3:
~x      = 1111 1111 0101 1010 (0xFFFFFF5A)
~y      = 1111 1111 1010 1000 (0xFFFFFFA8)
~x | ~y = 1111 1111 1111 1010 (0xFFFFFFFA)

#4:
!y = 0
x       = 0000 0000 1010 0101
!y      = 0000 0000 0000 0000
x & !y  = 0000 0000 0000 0000

あなたが見逃している!のは、ロジックではないということです。0 以外の値に適用する!と 0 になります~。 はビットごとの否定です。~1 と 0 を反転します。

于 2012-09-11T20:37:30.363 に答える
2

http://ideone.com/Xe0ch (私は単純なol'Cでそれを行うのが面倒でしたが、これらの操作はC ++でも同じ結果を生成するはずです)オンラインコンパイラはあなたの仕事をチェックする最も速い方法です:)

于 2012-09-11T20:26:46.413 に答える
1
于 2012-09-11T20:22:59.817 に答える