原码、反码、补码的计算方法
结论:
- 正数有:
原码 = 其二进制编码
原码 = 反码 = 补码 - 负数有:
原码 = 其绝对值二进制编码(即:对应正数的原码),最高位置1
反码 = 原码符号位不变,其他位取反
补码 = 反码+1
举例:
-
一个四字节的int类型的数字
9
原码:0000 0000 0000 0000 0000 0000 0000 1001
反码:0000 0000 0000 0000 0000 0000 0000 1001
补码:0000 0000 0000 0000 0000 0000 0000 1001 -
一个四字节的int类型负数
-9
原码:1000 0000 0000 0000 0000 0000 0000 1001
反码:1111 1111 1111 1111 1111 1111 1111 0110
补码:1111 1111 1111 1111 1111 1111 1111 0111
为什么会有补码?
计算机内部存储的,都是数字的补码!!!
用补码计算,无论是正数运算、负数运算、还是正负数混合运算,都能当做加法处理,快速计算得到结果。
如: 9-9 可以视为 9+(-9),补码计算后直接可以得到0,不用管符号位!
所以:补码看起来很麻烦,但是对计算机友好呀。
简单地说,都用补码的话,计算机内部计算的时候,就可以不用管符号位了,直接当加法算,更加高效。
位运算规则
常用的位运算符有 &
, |
, ^
, ~
, <<
, >>
当然,对于Java开发者来说,还有一个易混淆的>>>
运算规则:
&
与运算
两个位都为1时,结果才为1|
或运算
两个位都为0时,结果才为0^
异或运算
两个位相同为0,相异为1~
取反运算
0变1,1变0<<
左移
各二进位全部左移若干位,高位丢弃,低位补0(相当于乘以2)>>
带符号右移
各二进位全部右移若干位,符号位不变,正数左补0,负数左补1,低位舍弃(相当于除以2)>>>
无符号右移
各二进制位全部右移若干位,左边一律补0,低位舍弃
位运算常见的应用场景
记住一个口诀
清零取位要用与,某位置一可用或。
若要取反和交换,轻轻松松用异或。
举例:
- 某位清零,该位
&
一个0即可 - 要取某数某位的值,该位置
&
一个1 - 要将某位置一,该位
|
一个1即可 - 要将某位取反,该位置
^
一个1 - 若要交换两个数,也可以用
^
,方法如下:- a = a^b
- b = a^b
- a = a^b
关于异或交换两个数的原理:
第2步中,b = a ^b = abb = a(bb) = a^0 = a