Java位运算
1 相关知识
1.1 原码
原码是计算机对数字的二进制定点表示方法,原码表示法在数值前面增加了一位符号位(最高位为符号位)。0表示正数,1表示负数。 ## 1.2 反码 反码是数值存储的一种,但是由于补码更能够有效地表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示,反码的规则是:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各位取反。 ## 1.3 补码 在计算机中,数值一律按照补码的形式进行存储。因为使用补码可以将符号位和数值域统一处理,同时加法和减法也可以统一处理。补码的表示方法是:正数的补码就是其本身,负数的补码是在反码的基础上加1.
2 Java位运算
Java位运算只对int型整数有效,其他类型JVM先把其转换成int型再进行操作。
左移 <<
m << n 表示的含义是把整数n的二进制数左移n位,高位移出n位都舍弃,低位补0(此时可能出现正数变成负数) 在没有溢出的情况下,对于正数和负数,左移n位都相当于m乘以2的n次方。
右移 >>
与左移相反的理解,相当于m除以2的n次方,得到的为整数时,输出结果。结果若是小数,如果被除数是正数,得到的商会无条件舍弃小数位,如果m为负数,舍弃小数部分,然后把整数部分加1得到移位后的值。
无符号右移(>>>)
m>>>n表示正数m的二进制向右移位n位,不论是正负,高位都补0。
按位非操作(~)
~按位取非操作,对每个二进制位的内容取反。
按位与操作(&)
按位或操作(|)
按位异或(^)
异或操作是相同时取0,不同取1