C按位和逻辑表达式计算?

时间:2012-09-11 20:18:58

标签: c expression bit-manipulation

我一直在乱用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

3 个答案:

答案 0 :(得分: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反转。

答案 1 :(得分:2)

这里你去:http://ideone.com/Xe0ch(我在懒惰的时候很难做到这一点,但这些操作应该在C ++中产生相同的结果)在线编译器是检查你工作的最快方法:)< / p>

答案 2 :(得分:1)

检查好的方法是编写一个能够很好地打印数值的程序。

printf("%#x",expression);

the prinf function wikipedia