阅读原文:轻松搞定Java位运算我们日常开发中为运算使用的并不多,但如果能巧妙的使用位运算可以减少运行开销和优化算法,通过Java的源码可知,如HashMap。单位换算bit:位 一个二进制数据0或1,是1bit;byte:字节1 byte = 8 bit , 存储空间的基本计量单位一个英文字符占一个字节; 1 字母 = 1 byte = 8 bit一个汉字占2个字节; 1 汉字 = 2 byte = 16 bit支持的数据类型首先明确一点,Java中的位运算是针对整型的数据类型进行运算的,所以操作数必须是一下五种之一。数据类型所占位数(bit)byte8short16int32long64char16数据存储方式计算机中存储的数据最终是以二进制存储,如int类型的十进制数字10表示为32bit的二进制:0000 0000 0000 0000 0000 0000 0000 1010位运算符运算符意义&按位与|按位或按位非^按位异或<<左移>>右移<<<无符号右移按位与&操作十进制二进制 操作数130 0 1 1操作数250 1 0 1& 后结果10 0 0 1总结:对应位同为1时,才为1,否则全为0(对应位只要有0,全为0,否则为1)。另外:你可以把1理解为true,把0理解为false, true和false进行与(&)时,必须同为true时结果才为true.按位或 |操作十进制二进制 操作数130 0 1 1操作数250 1 0 1| 后结果70 1 1 1总结:对应位只要有1时,即为1,否则全为0(对应位只有全是0时,结果才是0,否则为1)。另外:你可以把1理解为true,把0理解为false, true和false进行或(|)时,只要有true,结果即为true。按位非操作十进制二进制 操作数130 0 1 1~ 后结果121 1 0 0总结:对每位进行取反。按位异或 ^操作十进制二进制 操作数130 0 1 1操作数250 1 0 1^ 后结果70 1 1 0总结:只要对应为不同即为1左移<< 和 右移 >>通过下面的图更加直观:左移总结m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方。溢出情况举例:5<<29,相当于 (2^2 + 1) * 2^29 ,这个结果显然大于正数的最大值 2^31-1,所以得出的是个负数。右移总结m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:如果m为正数,得到的商会无条件 的舍弃小数位;如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。无符号右移 >>>无符号右移>>> 与 右移>> 的区别就是无论操作数是正数还是负数,高位都是补0。