Java的运算符,分为四类:
算数运算符、关系运算符、逻辑运算符、位运算符。
算数运算符:+ - * / % ++ --
关系运算符:== != > >= < <=
逻辑运算符:&& || ! ^ & |
位运算符:& | ~ ^ << >> <<<
主要讨论一下位运算符。
位运算符是以二进制为单位进行的运算,其操作数和运算结果都是整型值。
位运算符的位与'&', 位或'|', 位非'~' ,位异或‘^’ , 右移'>>',左移'<<',0填充的右移'>>>' 与逻辑运算符运算的相应操作的真值表完全相同,其差别知识 为运算符操作的操作数和运算结果都是 二进制整数,而逻辑运算相应操作的操作数和运算结果都是boolean型。位运算的效率非常高。二进制首位(最高位)为符号位。0表示为正数,1表示为负数。
1、按位与运算符 &
规律如下:两个操作数中位都为1,结果才为1.否则结果为0。
int x = 15; //x等于二进制数的 0000 1111
int y = 6; //y等于二进制数的 0000 0110
int z = x&y; //z等于二进制的 0000 0110也就是十进制的6
2、按位或运算符 |
规律如下:两个操作数中只要有一个位为1,结果就为1。否则就为0。
int x = 15; //x等于二进制数的0000 1111
int y = 6; //y等于二进制数的0000 0110
int z = x|y; //z等于二进制数的 0000 1111
3、非运算符~
规律如下:如果位为0,结果是1,如果位为1,结果是0。
int x = 15;//x等于二进制数的 0000 1111
int y = ~15;//y等于二进制数的1111 0000
4、按位异或运算符^
规律如下:两个操作数的位中,相同则结果为0,不同则结果为1.
int x =15;//x等于二进制数的 0000 1111
int y = 6; //y等于二进制数的 0000 0110
int z=x^y; //z等于二进制数的 0000 1001
5、>>右移
规则如下:
按二进制形式把所有数字向后移动对应的位数,低位移出(舍弃),高位的空位补符号位。 例如将整数11向右位移1位的过程如图所示,11为正数,符号位为0。
6、<<左移
按二进制形式把所有数字向左移动对应的位数,高位移除(舍弃),低位的空位补零,例如将整数11向左位移1位的过程如下图所示。
例如HashMap中
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
将1左移4位。转换为2进制如下。0000 0001 ——>0001 0000 。由10进制的1变成10进制的16。
7、>>>无符号右移
按二进制形式把所有数字向后移动对应的位数,低位移出(舍弃),高位的空位补0。
8、移位运算和乘除运算的关系
对于正整数而言右移,往右移1位,相当于除以2。左移,往左移1位,相当于乘以2。
9、简单面试题
2的3次方等价于1左移3位,也就是1<<3。