位运算
什么是位运算
在计算机系统中,所有数据都是以二进制的形式进行存储,位运算就是对二进制中进行操作。所有的计算都是通过位运算进行实现的。
整数在计算机中
原码
原码是最简单的表示法,对于一个整数而言,最高位代表数据的正负,其他数位代表数据
比如对于一个8位二进制而言 , 00000010
代表有符号整数和没符号整数的 2
10000010
代表有符号整数的的-2
和没符号整数的 130
原码可以让我们更容易看出一个二进制的数值,但是也导致了 正数0和负数0的重合,比如 00000000
和10000000
表示 +0和 -0,在数学中,都表示0.但是与在计算机中没一个数字代表唯一的数位是相悖的,这容易造成数位的加减问题
反码
反码是原码转向补码的中间状态, 正数的反码为本身,负数的反码为除了符号位其他位取反 这解决了加减的问题
比如 -1 + 1,转化为反码就是 111111110
+ 0000000001
加起来为 11111111
得 -0
的反码,但是未解决0的问题。
补码
正数的补码是他原码,也是他的反码。负数的补码是反码加1。 计算机存储都是以补码的形式存储的,
这个就很好解决了0 和 负数加减的问题。
比如 在8位二进制表示的数中, -1
的原码为 10000001
。反码为 11111110
,那么他的补码为 111111111
,从补码我们可以看出,如果 -1 + 1
,可以很简单的转化为 00000000
,对应原码中的正数0,很好的解决了两个0的情况,也很好解决了数据的加减问题。
位运算
位运算的符号
符号 | 描述 | 规则 | 例子 |
---|---|---|---|
& | 与 | 两位想与,两位同时为1则为1 | 0 & 1 = 0, 1& 1 = 1, 0 & 0 = 0 |
| | 或 | 两位想或,有一个为1,则为1 | 0 | 1 = 1, 1 | 1 = 1, 0 | 0 = 0 |
^ | 异或 | 两位相同为0,两位不同为1 | 0 ^ 1 = 1, 0 ^ 0 = 0, 1 ^ 1 = 1 |
~ | 取反 | 0取反为1 ,1 取反为0 | ~0 = 1 , ~1 = 0 |
~(^) | 同或 | 相同为1,相反为0 | 实际上对异或取反,取决于当前一共有多少位 |
<< | 左移 | 向左移动一位 | 1 << 1 = 2, -1 << 1 = -2 |
>> | 右移 | 向右移动一位 | 2 >> 1 = 1 , -2 >> 1 = -1 |
>>> | 无符号右移 | 不带符号向右移动一位 | 2 >>> 1 = 1 ,-2 >>>1 = 2147483647 |
位运算的优先级
优先级 | 符号 | 描述 |
---|