位运算符
概念:
针对数据直接运算
基本的位运算符:
位与&:有0,则0
位或|:有1,则1
位异或^:相同则为0,不同则为1
反码~:所有的二进制位全部按位取反,0变1,1变0
class OperatorDemo{
public static void main(String[] args){
System.out.println(3&4) ;
System.out.println(3|4) ;
System.out.println(3 ^ 4) ;
System.out.println(~3) ;
}
}
/*
3和4对应的原码
00000000 00000000 00000000 00000011 3的原码,反码,补码
00000000 00000000 00000000 00000100 4的原码,反码,补码
位与&:有0,则0
00000000 00000000 00000000 00000011
位与&
00000000 00000000 00000000 00000100
----------------------------------------
00000000 00000000 00000000 00000000
结果是0
位或:有1,则1
00000000 00000000 00000000 00000011
位或|
00000000 00000000 00000000 00000100
-----------------------------------------------
00000000 00000000 00000000 00000111
7
位异或^:相同则为0,不同则为1
00000000 00000000 00000000 00000011
位异或^
00000000 00000000 00000000 00000100
----------------------------------------
00000000 00000000 00000000 00000111
7
~3 所有的二进制位全部按位取反,0变1,1变0
00000000 00000000 00000000 00000011
~
---------------------------------------
11111111 11111111 11111111 11111100 ----补码
最高符号位 数值位
1 1111111 11111111 11111111 11111100 补码
- 1
---------------------------------------------------------
1 1111111 11111111 11111111 11111011 反码
-----------------------------------------------------------
1 0000000 00000000 00000000 00000100 原码
- 4
*/
/*
位运算符里面的移位符号(扩展)
<<(左移):
将"<<"左边的数据向左移动指定的位数(补码进行移动),
将高位丢弃掉,空位补0
结论:将"<<"左边的数据乘以2的移动次幂
>>(右移):
将">>"左边的数据使用补码向右移动,如果最高符位是0,左边补0;
如果最高符号位是1,左边补1;
结论:将">>"左边的数据除以2的移动次幂
>>>(无符号右移):
将">>>"左边的数据使用补码向右移动,无论最高符号位是1
还是0,永远左边空位补0;
*/
class OperatorDemo2{
public static void main(String[] args){
System.out.println(3 << 2) ;//3左移2位 (12) 3*2^2
System.out.println(24 >> 2) ; //24 右移2位 24 /2^2 = 6
System.out.println(-24 >> 2) ;//-6
System.out.println(-24>>>2) ;
}
}
/*
整数默认int
3的原码-反码--补码相同
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100
00000000 00000000 00000000 00001100(补码---反码---原码)
24 >> 2
24的原码,反码,补码相同
00000000 00000000 00000000 00011000
0000000000 00000000 00000000 000110(00)
00000000 00000000 00000000 00000110 ---补码--反码---原码
6
-24 >> 2
10000000 00000000 00000000 00011000 原码
11111111 11111111 11111111 11100111 反码
+ 1
----------------------------------------
11111111 11111111 11111111 11101000 补码
1111111111 11111111 11111111 111010 (00) --移动后的补码
最高符号位 数值位
1 111111111 11111111 11111111 111010 补码
- 1
---------------------------------------------------
1 111111111 11111111 11111111 111001 反码
1 000000000 00000000 00000000 000110 原码
- 6
-24>>>2
11111111 11111111 11111111 11101000 补码
0011111111 11111111 11111111 111010 (00) 补码--反码---原码
/*
位异或^特点
一个数据被另一个数据位异或^两次,其值是它本身
*/
class OperatorDemo3{
public static void main(String[] args){
int a = 10 ;
int b = 20 ;
System.out.pritnln( a ^ b ^ b) ;
}
}
/*
位异或^概念:
相同则为0,不同则为1
a ^ b
00000000 00000000 00000000 00001010 --原码,反码,补码
00000000 00000000 00000000 00010100 --原码,反码,补码
------------------------------------------
00000000 00000000 00000000 00011110 --补码--反码---原码
00000000 00000000 00000000 00010100
-----------------------------------
00000000 00000000 00000000 00001010 10
*/