位运算符
数据转成二进制补码形式
&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、
>>(右移) <<(左移) >>>(无符号右移)
操作&、|、^、~
class WeiSuanDemo1{
public static void main(String[] args) {
//定义变量
int a=2;
int b=3;
//操作
System.out.println(a&b); //2
//操作|
System.out.println(a|b); //3
//操作^
System.out.println(a^b); //1
//操作~
System.out.println(~a); //-3
/*
00000000 00000000 00000000 00000010 int 2 补码
00000000 00000000 00000000 00000011 int 3
//操作& 遇0则0 任意整数&1==0 一定是偶数
//任意整数&正数 一定是正数
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
-----------------------------------------
00000000 00000000 00000000 00000020 2
//操作| 遇1则1 任意整数|0 一定是本身
//任意整数|负数 一定是负数
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
-----------------------------------------
00000000 00000000 00000000 00000011 3
//操作^ 相同则0,不同则1
//任意整数按位异或0,结果还是本身
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
-----------------------------------------
00000000 00000000 00000000 00000001 1
//操作~
//所有位按位取反
00000000 00000000 00000000 00000010
----------------------------------------
11111111 11111111 11111111 11111101 负数 补码
11111111 11111111 11111111 11111100 反码
10000000 00000000 00000000 00000011 原码 -3
*/
}
}
操作>>、<<、>>>
class WeiSuanDemo2{
public static void main(String[] args) {
int a=12;
//操作>>
System.out.println(a>>2); //3
//操作<<
System.out.println(a<<2); //48
//操作>>>
System.out.println(a>>>2); //3
}
}
/*
00000000 00000000 00000000 00001100 int 12
//操作>> a/2^移动位数
[00]00000000 00000000 00000000 00000011 3
----------------------------------------------
//操作<< a*2^移动位数
00000000 00000000 00000000 00110000 48
//操作>>> 结果一定是正数
00000000 00000000 00000000 00000011 3
*/
}
按位异或的扩展结论(当一个整数按位异或上另一个整数两次,结果还是本身)
int a=2;
int b=5;
System.out.println(a^b^a); //5
System.out.println(b^a^b); //2