运算符分类:
位运算运算符
注意:要做位运算,首先要把数据转换为二进制
(使用的是补码)
位运算符:
&(有0则0) , | (有1则1) ,
^(相同则0,不同则1) , ~(0变1,1变0) ,
<<(左移) , >>(右移) , >>>(无符号)
位运算例子
class YunSuan{
public static void main(String[] args){
int a = 3;
int b = 4;
System.out.println(3 & 4);//输出结果0
System.out.println(3 | 4);//输出结果7
System.out.println(3 ^ 4);//输出结果7
System.out.println( ~3);//输出结果-4
/* 分析:
3的二进制
00000000 00000000 00000000 00000011
4的二进制
00000000 00000000 00000000 00000100
&位运算:有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
~位运算:0变1,1变0
00000000 00000000 00000000 00000011
~11111111 11111111 11111111 11111100
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
结果是:-4
*/
}
}
^位的特点:一个数据对另一个数据异或(^)两次,该数据本身不变
例子:
class YunSuan{
public static void main(String[] args){
int a = 10;
int b = 20;
System.out.println( a ^ b ^ b );// 10
System.out.println( a ^ b ^ a );// 20
}
}
<<:左移 左边最高位丢弃,右边补齐0
>>:右移 最高位是0,左边补1 最高为位是1左边补1
>>>无符号:无论最高位是0还是1,左边补齐0
例子:
class YunSuan{
public static void main(String[] args){
//<<把<<左边的数据*2的移动次幂
System.out.println( 3 << 2 );//输出结果:3*2^2=12
//>> 同理把>>左边的数据除以2的移动次幂
System.out.println(24 >> 2);//输出结果:24/2^2=6
System.out.prinyln(-24 >> 2);//输出结果:-24/2^2=-6
System.out.println(-24 >>> 2);//输出结果:1073741818
/*
( 3 << 2 )意思:计算出三的二进制,再向左移动两位丢弃,右边补0,<<的移动 计算出3的二进制
00000000 00000000 00000000 00000011
(00)00000000 00000000 00000000 00001100
>>的移动 计算-24的二进制:
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00)
补码:1111111111 11111111 11111111 111010(00)
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
>>>的移动 计算-24的二进制:
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
补码:0011111111 11111111 11111111 111010(00)
反码:0011111111 11111111 11111111 111010(00)
原码:0011111111 11111111 11111111 111010(00)
结果:1073741818
*/
}
}
例题:
- 请自己实现两个数的变量交换 。
- 请用最有效率的方式计算出2乘以8的结果?
例题一解决方法:
class yunsuan{
public static void main(String[] args){
int a = 10;
int b = 20;
System.out.println("a:"+a)
System.out.println("b:"+b)
方法一:使用第三变量
int c = a;
a = b;
b = c;
System.out.println("a:"+a)
System.out.println("b:"+b)
//输出结果:a:20 b:10
方法二:用位异或运算
a=a^b;
b=a^b;//a^b等于a^b^b=a
a=a^b;//a^b等于a^b^a=b
方法三:
a=a+b;//a=30
b=a-b;//b=10
a=a-b;//a=20
方法四:一句话搞定
b=(a+b) - (a=b);//b=30-20=10 a=20
System
}
}
例题二解决方法:
class YunSuan{
public static void main(String[] args){
System.out.println(2*8);
System.out.println(2 << 3);
}
}