按位运算符
将数据在内存中二进制存储按照位运算计算得出最终结果
& 按位与,相当于”并且”(对整型和布尔计算)
| 按位或,相当于”或者”(对整型和布尔计算)
按位或/按位与不会出现逻辑或/逻辑与的短路现象
~ 按位非(只对整型计算)
^ 按位异或(对整型或布尔计算)
/*
*对布尔进行计算
*/
public class BitOperator{
public static void main (String []args){
/*
*按位与&,不短路底层按位进行计算
*/
int n = 6;
int m = 7;
int k = 8;
boolean bool = m < n & m == --k;
System.out.println(bool);//输出结果为false
System.out.println(k);//输出结果为7,前面虽然已经能判断结果,但依旧计算
/*
*按位或|,不短路底层按位进行计算
*/
boolean bool2 = m>n | ++n == m;
System.out.println(bool2);//输出结果为true
System.out.println(n);//输出结果为7,前面虽然已经能判断结果,但依旧计算
}
}
对整数运算
按位与& 如果两个整数对应位都是1则结果为1,否则为0
按位或| 如果两个整数对应位都是0则结果为0,否则为1
5&4 结果为4 -5&5 结果为 1(0 0001)
二进制表示 5 0 0101 -5 1 1011
4 0 0100 5 0 0101
0 0100 0 0001
5|4 结果为5 -5|5 结果为 -15(1 1111)
二进制表示 5 0 0101 -5 1 1011
4 0 0100 5 0 0101
0 0101 1 1111
按位非~(单目运算符)对一个整数进行按位计算
如果位是0,结果为1,如果位是1,结果为0
~5 结果为-6(1 1010)
二进制表示5 0 0101
取反后 1 1010
按位异或运算符(草帽运算符)
^ 2个布尔表达式计算结果相同则最终结果为false,否则为true
public class BitOperator{
public static void main (String []args){
/*
*按位异或^对布尔表达式计算,相同为false否则为true
*/
System.out.println(“true异或true”+(1 = 1 ^ 3>2));//输出结果为false
System.out.println(“true异或false”+(1 = 1 ^ 3<2));//输出结果为true
}
}
对两个数按位对应比较,相同为0,不同为1
5^6结果为3(0 0011)
二进制表示 5 0 0101
6 0 0110
0 0011
移位运算符
<< value<<num 左移
>> value>>num 右移
>>> value>>>num 无符号右移
Value:表示数值 num:表示一个移动的数值
左移运算符<<
丢弃最高位,0补最低位
移动位数超过了该类型的最大位数,则移动的位数取模(假如存储最大为24,要求左移30位,最终会左移6位)
在数字没有溢出的前提下,对于正数和负数,左移n位相当于乘以2的n次方
public class BitOperator{
public static void main (String []args){
int n = 2;
System.out.println(n<<2);//相当于n左移两位,输出结果为8
System.out.println(n<<32);//超出范围,相当于n左移(34%8)2位,输出结果为8
}
}
//二进制表示2 0000 0010
//二进制表示8 0000 1000
右移运算符>>
按二进制的形式把所有的位数向右移动相应的位数,低位移出(舍弃),高位的空位补符号位,即正数补0负数补1
右移n位相当于除以2的n次方
public class BitOperator{
public static void main (String []args){
int m = 5;
System.out.println(n>>2);//相当于n右移2位,输出结果为1
System.out.println(n>>9);//相当于n右移9位,输出结果为0
System.out.println(-9>>2);//相当于-9右移2位,输出结果为-3
}
}
//二进制表示 5 0101 -9 1 1001
// 8 0001 -3 1 0011
无符号右移运算符>>>
忽略符号位扩展,0补最高位
无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于整数来说这种运算没有意义
public class ShiftOperator{
public static void main (String []args){
int m = 5;
System.out.println(-9>>>2);//相当于-9无符号右移2位,输出结果为1073741821
}
}
//二进制表示-9 1 1001
/*
产生这个结果这是因为-9二进制表示中1001前边都是1,最高位变成0作为符号位,
其他的1当做有效的数值位,所以就会出现这么大的数值
*/