Java中的位运算
在Java运算中有一种较为神秘的运算符——“位运算符”,说它神秘,主要是考虑到它的不常用性,一般在运算中,权限管理和游戏开发涉及到位运算比较多。
Java位运算符有:~(取反),&(和),|(或),^(亦或),>>(右移),<<(左移)。
那么位运算符到底是什么呢,见名知义,我们都知道,一字节等于8位,“位操作”就是在位级别上,对数值(二进制)进行操作运算,我们将对几种位运算一一解读:
1、~(取反)
首先我们要知道二进制在内存中是以补码存储的,二进制的第一位为符号位,0表示正数,1表示负数。
正数:
补码、反码与原码都是一样的。
负数:
反码是原码的符号位不变,其余各位取反得到的,
补码是在反码的基础上加1。
例1:~8在内存中的求解步骤:
8的二进制是1000(第一位的0表示为正数)
也就是说其补码为01000,
补码取反得10111,
结果的反码为:10111减去1得10110(为负数)
结果的原码为:11001(符号位不变,其余各位取反)
结果即为:-9
例2:~(-9)在内存中的求解步骤:
9的二进制是1001
也就是说-9的原码是11001,
反码为:10110(符号位不变,其余各位取反),
补码为:10111,
然后补码取反为:01000,
结果的补码为01000(正数),
那么结果的反码,原码均为01000,
结果即为:8
总结:
2、&(和)
对两个数值的二进制位进行和运算
8的二进制是1000
4的二进制是0100
那么8&4的二进制为0000,即为0
3、|(或)
对两个数值的二进制位进行或运算
8的二进制是1000
4的二进制是0100
那么8|4的二进制为1100,即为12
4、^(亦或)
对两个数值的二进制位进行亦或运算,对应位不同则为1,否则为0
8的二进制是1000
4的二进制是0100
那么8^4的二进制为1100,即为12
5、左移和右移
右移一位相当于除以2求商
左移一位相当于乘以2求积
例如:12>>2=3
2<<3=16
6、扩展
位操作中的&、|与逻辑运算符&&、||有明显的区别:
1.它们均属于二元运算符,逻辑运算符两边只能是逻辑值,而&、|两边不仅可以是逻辑值,还可以是数值,进行位操作。
2.逻辑运算符又称短路运算符,当&&左边为false时,运算将不再继续进行,当||左边为true时,运算将不再继续进行,
而&、|则会继续判断,相比之下,效率较低。