位运算
运行速度最快的一种运算方式
- &:按位与
- |:按位或
- ~:按位非
- ^:按位异或
- <<:左位移运算符
- " >> ":右位移运算符
- " >>> ":无符号右移运算符
除 ~ 以 外 ,其余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和字 符 型 数 据
按位与: 10101 01010 结果 00000
按位与:只有当比较的两位都是1时,值才是1
按位或: 10101 01010 结果 11111
按位或:只有当比较的两位有一个是1时,值才是1
按位非: ~10101 = 01010
按位非:所有位取反(唯一的一位运算符)
按位异或: 10101 10101 01010 11111 结果 11111 01010
按位异或:只有当比较的两位有一个是1时,且另一个是0时,值才是1
左移运算符: 3 <<2(3为int型) 把3转换为二进制数字0011, 0011 << 2 = 1100 = 12
左移运算符:即将小数点右移两位,或者数左移两位,相当于乘以 22 = 4,即左移多少位,就相当于乘以2的多少次方
右移运算符: 12 >> 2(3为int型) 把12转换为二进制数字1100, 1100 >> 2 = 0011 = 3
右移运算符:即将小数点左移两位,或者数右移两位,相当于除以 22 = 4,即右左移多少位,就相当于乘以2的多少次方
System.out.println(8 >>> 2);
System.out.println(-8 >> 2);
System.out.println(-8 >>> 2);
无符号右移,忽略符号位,空位都以0补齐,前两个都没有问题,但是第三个是个整数,因为 >>>
右移时,忽略符号为空位都以0补齐,所以以0补齐后,就是正数了,而之气的符号为1,就加入运算了,导致数特别大
位运算为什么速度最快
在计算即的内部,只有加法,其他的,比如剑法,乘法,除法,都是由加法演变过来的,所以在左计算之前,都要进行转变;如:
int num = 100 * 100;
int num2 = 100 >> 6 + 100 >> 5 + 100 >> 2;
上面的 num == num2;但是下面的运算要快一点,因为字面的是直接对100进行的位运算,即直接对该数的二进制进行计算,而第一个还需要先转化为加法的形式,然后转化为二进制,然后再进行为操作,所以一个是直接进行位运算,一个需要结果i转化再进行位运算
程序中的所有数在内存中都是以二进制的形式存储,位运算符就是直接对二进制数进行操作运算,所以速度很快