移位运算符
1、左移运算符(<<)
左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0),如200<<3=200*2^3=1600
2、“无符号”右移运算符(>>)
“无符号”右移运算符,将运算符左边的对象向右移动运算符右边指定的位数(在高位补0),如200>>3=200/(2^3)=25
3、“有符号”右移运算符(>>>)
“有符号”右移运算符,将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1,也就是说,">>>“和”>>"对正数的效果没有区别
public class ShiftOperate {
public static void main(String[] args) {
System.out.println(200<<3);
System.out.println(200>>3);
System.out.println(200>>>3);
System.out.println(-200>>>3);
}
}
1600
25
25
536870887
结果的解释:
200(2)=11001000(10)
200<<3⇔11001000000(2)=1600(10)
200>>3⇔11001(2)=25(10)
200>>>3⇔11001(2)=25(10)
-200:
在java中的储存形式(补码)是:11111111 11111111 11111111 00111000(2)
-200>>>3即右移三位,高位补1:11111111 11111111 11111111 11100111(2)=536870887(10)
注:原码反码补码的关系请见:java 负数与二进制(原码补码反码科普)
位运算符
按位与 & 按位或 | 按位异或 ^
public class BitwiseOperators {
public static void main(String[] args) {
int x=20;
int y=12;
/*
* &操作符左右两侧如果是布尔值, &就是逻辑与;
* 左右两侧为整数,就是按位与
*/
System.out.print("true逻辑与false:");
System.out.println(true&false);
/*
* 20的二进制表示为:00000000 00000000 00000000 00010100(2)=20
* 12的二进制表示为:00000000 00000000 00000000 00001100(2)=12
* 20&12是按位与 : 00000000 00000000 00000000 00000100(2)=4
*/
System.out.print("20&12:");
System.out.println(x&y);
System.out.println();
/*
* *************************我是分割线******************************
*/
/*
* |操作符左右两侧如果是布尔值, |就是逻辑或;
* 左右两侧为整数,就是按位或
*/
System.out.print("true逻辑或false:");
System.out.println(true|false);
/*
* 20的二进制表示为:00000000 00000000 00000000 00010100(2)=20
* 12的二进制表示为:00000000 00000000 00000000 00001100(2)=12
* 20&12是按位或 : 00000000 00000000 00000000 00011100(2)=28
*/
System.out.print("20|12:");
System.out.println(x|y);
System.out.println();
/*
* *************************我是分割线******************************
*/
/*
* ^操作符左右两侧如果是布尔值, ^就是逻辑异或;
* 左右两侧为整数,就是按位异或
*/
System.out.print("true逻辑异或false:");
System.out.println(true^false);
/*
* 20的二进制表示为:00000000 00000000 00000000 00010100(2)=20
* 12的二进制表示为:00000000 00000000 00000000 00001100(2)=12
* 20&12是按位或 : 00000000 00000000 00000000 00011000(2)=24
*/
System.out.print("20^12:");
System.out.println(x^y);
}
}
true逻辑与false:false
20&12:4
true逻辑或false:true
20|12:28
true逻辑异或false:true
20^12:24