位运算符
位运算符
1、| 按位或 ( 逐位或 )
2、& 按位与 ( 逐位与 )
3、^ 按位异或 (逐位异或 )
4、~ 按位取反 (逐位取反) 【注意连符号位也一起取反】
public class BitOperator4 { public static void main(String[] args) { final int x = 5 ; // 0b00000000_00000000_00000000_00000101 final int y = 7 ; // 0b00000000_00000000_00000000_00000111 //【 5 】0b00000000_00000000_00000000_00000101 //【 7 】0b00000000_00000000_00000000_00000111 int a = x | y ; // 按位或: 0b00000000_00000000_00000000_00000111 System.out.println( a ); //【 5 】0b00000000_00000000_00000000_00000101 //【 7 】0b00000000_00000000_00000000_00000111 int b = x & y ; // 按位与: 0b00000000_00000000_00000000_00000101 System.out.println( b ); //【 5 】0b00000000_00000000_00000000_00000101 //【 7 】0b00000000_00000000_00000000_00000111 int c = x ^ y ; // 按位异或: 0b00000000_00000000_00000000_00000010 System.out.println( c ); System.out.println( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); int r = 5 ; // 0b00000000_00000000_00000000_00000101 int s = 7 ; // 0b00000000_00000000_00000000_00000111 System.out.println( "r = " + r + " , s = " + s ); // int temp = s ; s = r ; r = temp ; r = r ^ s ; // 0b00000000_00000000_00000000_00000010 s = r ^ s ; // 0b00000000_00000000_00000000_00000101 r = r ^ s ; // 0b00000000_00000000_00000000_00000111 System.out.println( "r = " + r + " , s = " + s ); System.out.println( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); int j = 5 ; // 0b00000000_00000000_00000000_00000101 // 注意使用 ~ 按位取反时,会对整数的符号位也取反 int k = ~j ; //0b11111111_11111111_11111111_11111010 //【补码】 11111111_11111111_11111111_11111010 //【反码】 11111111_11111111_11111111_11111001 //【原码】 10000000_00000000_00000000_00000110 System.out.println( "j = " + j + " , k = " + k ); } }
位运算符 - 移位
1、>> 向右移位,使用方法为 x >> n 表示 x 向右移动 n 位
对于正数来说,向右移位时,高位补0,低位被挤掉
对于负数来说,向右移位时,高位补1,低位被挤掉
2、<< 向左移位,使用方法为 x << n 表示 x 向左移动 n 位
不论是正数还是负数,向左移位时,都是挤掉高位,低位补0
3、>>> 无符号右移
不论是正数还是负数,向右移位时,高位一律补0,低位被挤掉
4、Java 中没有 <<< 运算符 【划重点】
public class BitOperator1 { public static void main(String[] args) { // 被 final 修饰的变量被称作【最终变量】,它是最终的、不可更改的变量 【不要当做"常量"对待】 final int x = 5 ; // 0b00000000_00000000_00000000_00000101 System.out.println( x ); // 尝试再次为 final 修饰的变量赋值 // x = 6 ; // 错误: 无法为最终变量x分配值 // 将 最终变量 x 中存储的数值向右移动1位后赋值给 y 变量 int y = x >> 1 ; // 0b0_00000000_00000000_00000000_0000010 System.out.println( y ); int z = x << 1 ; // 0b0000000_00000000_00000000_00000101_0 System.out.println( z ); System.out.println( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); // -5【原码】: 1000_0000_0000_0000_0000_0000_0000_0101 // -5【反码】: 1111_1111_1111_1111_1111_1111_1111_1010 // -5【补码】: 1111_1111_1111_1111_1111_1111_1111_1011 final int m = -5 ; // 0b1111_1111_1111_1111_1111_1111_1111_1011 System.out.println( m ); int n = m >> 1 ; // // 0b1_1111_1111_1111_1111_1111_1111_1111_101 //【补码】1_1111_1111_1111_1111_1111_1111_1111_101 //【反码】1_1111_1111_1111_1111_1111_1111_1111_100 //【原码】1_0000_0000_0000_0000_0000_0000_0000_011 System.out.println( n ); System.out.println( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); int p = m << 1 ; // 0b111_1111_1111_1111_1111_1111_1111_1011_0 //【补码】111_1111_1111_1111_1111_1111_1111_1011_0 //【反码】111_1111_1111_1111_1111_1111_1111_1010_1 //【原码】100_0000_0000_0000_0000_0000_0000_0101_0 System.out.println( p ); System.out.println( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); int r = 0x7FFFFFFF ; System.out.println( r ); int s = r << 1 ; System.out.println( s ); } }
public class BitOperator2 { public static void main(String[] args) { final int x = 5 ; // 0b00000000_00000000_00000000_00000101 final int y = -5 ; // 0b1111_1111_1111_1111_1111_1111_1111_1011 System.out.println( x >> 1 ); // 0b0_00000000_00000000_00000000_0000010 System.out.println( y >> 1 ); // 0b1_1111_1111_1111_1111_1111_1111_1111_101 System.out.println( "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~" ); System.out.println( x >>> 1 ); // 0b0_00000000_00000000_00000000_0000010 System.out.println( y >>> 1 ); // 0b0_1111_1111_1111_1111_1111_1111_1111_101 } }