java 位运算

  // 左移运 <<  左移位,在低位处补0
  // 5 = 0000 0101  移动两位
  //   = 0001 0100  = 20
  // "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
  
  // 右移位 >> ,若为正数则高位补0,若为负数则高位补1
  // 5 = 0000 0101  移动两位
  //   = 0000 0001  = 0
  // -5 = 1111 1111 1111 1111 1111 1111 1111 1011
  //      1111 1111 1111 1111 1111 1111 1111 1110
  // 
  
  //无符号右移位 >>> ,无论正负都在高位补0
  // 1111 1111 1111 1111 1111 1111 1111 1011
  // 0111 1111 1111 1111 1111 1111 1111 1110
  
  // byte b = 127 = 0111 1111
  // b << 3 =    11 1111 1000 = 1016 (转换成int)
  // (byte)(b << 3) = 1111 1000 = -8
  
  // 5<<35 这个结果将是什么呢?
  // 如果移位操作数超出了该位数则取模计算 ==> 5 << 35 == 5 << (35 % 32) ==> 5 << 3 = 40
  
  // & 与(AND) [真真为真,其余为假],对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。
  // 5 & 3
  //   0000 0000 0000 0000 0000 0000 0000 0101
  // & 0000 0000 0000 0000 0000 0000 0000 0011
  // = 0000 0000 0000 0000 0000 0000 0000 0001
  // 1、清零特定位 (mask中特定位置0,其它位为1,s=s&mask) 
  // 清零第三位 0000 0101 & 1111 1011 ==> 0000 0001
  // 2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask) 
  // 0000 0101 & 0000 0100 ==> 0000 0100
  // 
  // 0&0=0,0&1=0 0与任何数 = 0
  // 1&0=0,1&1=1 1与任何数 = 任何数
  // 任何数异或自己=自己
  
  
  // | 或(OR) [假假为假,其余全真] 对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
  // 5 & 3
  //   0000 0000 0000 0000 0000 0000 0000 0101
  // | 0000 0000 0000 0000 0000 0000 0000 0011
  // = 0000 0000 0000 0000 0000 0000 0000 0111
  
  // ~ 非(NOT) [真则假,假则真] 一元运算符。
  // ~5
  //   0000 0000 0000 0000 0000 0000 0000 0101
  // ~ 1111 1111 1111 1111 1111 1111 1111 1010
  
  // ^ 异或(XOR) [相同为假,不同为真] 对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1
  // 5 ^ 3
  //   0000 0000 0000 0000 0000 0000 0000 0101
  // ^ 0000 0000 0000 0000 0000 0000 0000 0011
  // = 0000 0000 0000 0000 0000 0000 0000 0110

经验分享

  • 按位异或可以不使用临时变量完成两个值的交换,也可以使某个整型数的特定位的值翻转。
  • 按位与运算可以用来屏蔽特定的位,也可以用来取某个数型数中某些特定的位。
  • 按位或运算可以用来对某个整型数的特定位的值置l。

异或

参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0
例如:10100001^00010001=10110000

  • 00=0,01=1 0异或任何数=任何数
  • 10=1,11=0 1异或任何数-任何数取反
  • 任何数异或自己=把自己置0

(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。

10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6

(2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:

a=10100001,b=00000110
a=a^b;   //a=10100111
b=b^a;   //b=10100001
a=a^b;   //a=00000110

(3)异或运算符的特点是:数a两次异或同一个数b(a=abb)仍然为原值a.

你可能感兴趣的:(java 位运算)