位运算符

2019-11-02  本文已影响0人  lj72808up

1. 负数的表示

负数表示为: 对应的正数, 先取反, 再加1

-1的表示: 
    1. 1表示为:  0000 0000 0000 0000 0000 0000 0000 0001
    2. 各位取反: 1111 1111 1111 1111 1111 1111 1111 1110
    3. 取反+1:   1111 1111 1111 1111 1111 1111 1111 1111
int a = -1;
int b = 0xffffffff;
System.out.println(b);  // -1

2. 带符号左移/右移 (<<>>), 无符号右移(>>>)

int c = -1;  // 1111 1111 1111 1111 1111 1111 1111 1111
System.out.println( c<<1 ); // -2
System.out.println( 0xfffffffe );  // -2 (1111 1111 1111 1111 1111 1111 1111 1110)

System.out.println( c>>1 ); // -1   "1111 1111 1111 1111 1111 1111 1111 1111"高位补1

System.out.println( c>>>1 );   //2147483647  "0111 1111 1111 1111 1111 1111 1111 1111"高位补0
System.out.println(0x7fffffff);//2147483647

3. 诸位取反~

int a = 1;  // 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(~a); // 所有位取反: "1111 1111 1111 1111 1111 1111 1111 1110", -2
System.out.println(0xfffffffe);

3. 异或^

  1. 法则:
1^1 = 0 , 1^0 = 0 , 0^0=0 
  1. 异或的运用
    1. 实现将一个数的某一位翻转: 比如让数a的第n位翻转, 可以用a^(1<<n-1)
    int a = 0x73;  // 0111 0011
    //将a的第3位翻转
    int b = a^(1<<2);
    System.out.println(b);  //119
    int a1 = 0x77 ; // 0111 0111
    System.out.println(a1); //119
    
    1. 交换2个数
    int a = 0x73;  // 0111 0011
    int b = 0x70;  // 0111 0000
    System.out.println(a);  // 115
    System.out.println(b);  // 112
    
    a = a^b;
    b = b^a;
    a = a^b;
    
    System.out.println(a);  // 112
    System.out.println(b);  // 115
    
    1. 汇编语言中, 通常使用异或将一个数置0
    XOR a a
    
    1. 快速判断两个数是否相等
    return (a^b)==0
    
上一篇 下一篇

猜你喜欢

热点阅读