Java位运算符
发布时间 2023-04-17 10:20:22作者: 晚秋的风
前置知识
- 原码、反码、补码
- 原码:第一位表示符号,其余位表示值。如 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)
示例
- 正数(正数的补码等于本身,直接计算即可)
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