警告
本文最后更新于 2022-12-01 21:11,文中内容可能已过时。
先简单说一些概念:
原码:从符号位开始表示,0是正数,1是负数
反码:
- 正数的原码反码补码都是一样的。
- 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
比如-5转成二进制原码1101,在算出反码1010
补码:
- 正数的原码反码补码都是一样的。
- 负数的补码是反码+1
1.按位与&
:
1
2
3
4
5
6
7
8
9
10
11
| #下面的与运算结果是4
>>> a = 15
>>> b = 36
>>> a & b
4
# 计算过程
首先将a和b转换成二进制补码,每一位进行与运算,上下两个数都为1结果就是1,否则为0
a = 0000 1111 = 15
b = 0010 0100 = 36
res = 0000 0100 = 4
|
2.按位或|
:
1
2
3
4
5
6
7
8
9
10
| >>> a = 15
>>> b = 36
>>> a | b
47
# 计算过程
首先将a和b转换成二进制补码,每一位进行或运算,上下两个数只要有一个数为1结果就是1,否则为0
a = 0000 1111 = 15
b = 0010 0100 = 36
res = 0010 1111 = 47
|
3.按位异或^
:
1
2
3
4
5
6
7
8
9
10
| >>> a = 15
>>> b = 36
>>> a ^ b
47
# 计算过程
首先将a和b转换成二进制补码,每一位进行异或运算,上下两个数相同为0,不同为1
a = 0000 1111 = 15
b = 0010 0100 = 36
res = 0010 1011 = 43
|
4.按位取反~
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| >>> a = 15
>>> ~a
-16
#计算过程
首先将a转换成二进制补码,每一位进行取反
a = 0000 1111 = 15
not = 1111 0000 = 符号位为1(即负数) 补码
-------------------------------------------------------
#已知补码计算反码(上面说到了负数的补码=反码+1,所以补码-1=反码)
1111 0000
- 1
---------------------
1110 1111 反码
#已知反码求原码(负数的反码=原码的符号位不变,其余各个位取反,
#所以我们将数值位取反即可算出原码)
1110 1111
1001 0000 原码
#至此就算出了取反后的原码,我们在用8421法将二进制原码换算成10进制,最后的结果就是-16
|
按位左移<<
:
1
2
3
4
5
6
7
8
9
10
| >>> a = 15
#左移两位
>>> a << 2
60
# 计算过程
首先将a转换成二进制补码,然后往左边移动两位,右边少的两位用0来补
a = 0000 1111 = 15
000011 1100 = 60
0011 1100 = 60
|
按位右移动>>
:
1
2
3
4
5
6
7
8
9
| >>> a = 15
#右移两位
>>> a >> 2
3
# 计算过程
首先将a转换成二进制补码,然后往右移动两位,左边少的两位用0来补
a = 0000 1111 = 15
0000 0011 = 3
|