Java位运算符
前置知识
- 原码、反码、补码
- 原码:第一位表示符号,其余位表示值。如 2原码:0000 0010;-2原码:1000 0010
- 反码:正数的反码是原码本身,负数的反码在原码基础上,符号位不变,其他位取反。如:2反码:0000 0010;-2反码:1111 1101
- 补码:正数的反码是原码本身,负数的补码在原码基础上,符号位不变,其他位取反,最后位+1。如:2补码:0000 0010;-2补码:1111 1110 - 计算机中的数字是通过二进制编码的方式进行存储,而负数使用补码表示法进行存储,进行位运算时先运算补码,再转为十进制输出。
说明
- 概述:位运算符,用来操作变量的二进制位,分为按位运算符
& | ^ ~
和 移位运算符<< >> >>>
- 按位运算符:对二进制位执行布尔代数计算。包含:按位且AND(&)、按位或OR(|)、按位异或XOR(^)、按位非NOT(~)
- &:两个输入位都是1,则为1,否则为0;
- |:两个输入位都是0,则为0,否则为1;
- ^:两个输入位相同为0,不同为1;
- 特点:交换律
A^B^C=A^C^B
,结合律A^B^C=A^(B^C)
,自反性A^0=A,A^A=0
- 应用场景:1.在不引入第三个变量的情况下,转换两个变量的值;2.找出唯一一个成对的数;3.找出唯一一个落单的数
- 特点:交换律
- ~:输入位0改为1,1改为0。
- 移位运算符:对二进制位向左向右移动。包含:左移位(<<)、有符号右移位(>>)、无符号右移位(>>>)
- <<:将二进制数位整体向左移动N位(低位补0)左移一位相当于乘以2,负数左移等于正数左移乘以-1
- >>:将二进制数位整体向右移动N位(正数高位补0,负数高位补1)右移一位相当于除以2
- >>>:将二进制数位整体向右移动N位(正负都高位补0)
- 按位运算符:对二进制位执行布尔代数计算。包含:按位且AND(&)、按位或OR(|)、按位异或XOR(^)、按位非NOT(~)
示例
- 正数(正数的补码等于本身,直接计算即可)
33&44 33原码:0010 0001 44原码:0010 1100 =》0010 0000 =》32 33|44 33原码:0010 0001 44原码:0010 1100 =》0010 1101 =》45 33^44 33原码:0010 0001 44原码:0010 1100 =》0000 1101 =》13 ~33 33原码:0010 0001 33反码:0010 0001 33补码:0010 0001 ~33补码:1101 1110 ~33反码:1101 1101 ~33原码:1010 0010 =》-34 33<<2 33原码:00000000 00100001 =》00000000 10000100(低位补0) =》132 33>>2 33原码:00000000 00100001 =》0(00)00000 00001000(有符号高位补0) =》8 33>>>2 33原码:00000000 00100001 =》(00)000000 00001000(无符号高位补0) =》8
- 负数(负数需要先计算补码,再进行位运算)
-33&44 -33原码:1010 0001 -33反码:1101 1110 -33补码:1101 1111 44补码:0010 1100 《= 44原码:0010 1100 =》 -33&44补码:0000 1100(首位为0表示正数,补码=反码=原码) -33&44反码:0000 1100 -33&44原码:0000 1100 =》12 -33|44 -33原码:1010 0001 -33反码:1101 1110 -33补码:1101 1111 44补码:0010 1100 《= 44原码:0010 1100 =》 -33&44补码:1111 1111 -33&44反码:1111 1110 -33&44原码:1000 0001 =》-1 -33^44 -33原码:1010 0001 -33反码:1101 1110 -33补码:1101 1111 44补码:0010 1100 《= 44原码:0010 1100 =》 -33^44补码:1111 0011 -33^44反码:1111 0010 -33^44原码:1000 1101 =》-13 ~ -33 -33原码:1010 0001 -33反码:1101 1110 -33补码:1101 1111 =》 ~-33补码:0010 0000 ~-33反码:0010 0000 ~-33原码:0010 0000 =》32 -33<<2 -33原码:10000000 00100001 -33反码:11111111 11011110 -33补码:11111111 11011111 左二补码:11111111 011111(00)(左移低位补0) 左二反码:11111111 01111011 左二原码:10000000 10000100 =》-132(其实就是 正数移位后*-1) -33>>2 -33原码:10000000 00100001 -33反码:11111111 11011110 -33补码:11111111 11011111 右二补码:1(11)11111 11110111(有符号右移负数高位补1) 右二反码:11111111 11110110 右二原码:10000000 00001001 =》-9 -33>>>2 -33原码:10000000 00000000 00000000 00100001 -33反码:11111111 11111111 11111111 11011110 -33补码:11111111 11111111 11111111 11011111 右二补码:(00)111111 11111111 11111111 11110111(无符号右移高位补0) 右二反码:00111111 11111111 11111111 11110111 右二原码:00111111 11111111 11111111 11110111 =》1073741815