先简单说一些概念:
原码:从符号位开始表示,1是正数,0是负数
反码:正数的原码反码补码都是一样的。
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
比如-5转成二进制原码1101,在算出反码1010
补码:正数的原码反码补码都是一样的。
负数的补码是反码+1
1.按位与&:#下面的与运算结果是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.按位或|:>>> 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.按位异或^:>>> a = 15
>>> b = 36
>>> a ^ b
47
# 计算过程
首先将a和b转换成二进制补码,每一位进行异或运算,上下两个数相同为0,不同为1
a = 0000 1111 = 15
b = 0010 0100 = 36
res = 0010 1011 = 43
4.按位取反~:>>> 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
按位左移<<:>>> a = 15
#左移两位
>>> a << 2
60
# 计算过程
首先将a和b转换成二进制补码,然后往左边移动两位,右边少的两位用0来补
a = 0000 1111 = 15
000011 1100 = 60
0011 1100 = 60
按位右移动>>:>>> a = 15
#右移两位
>>> a >> 2
3
# 计算过程
首先将a和b转换成二进制补码,然后往右移动两位,左边少的两位用0来补
a = 0000 1111 = 15
0000 0011 = 3
最后更新于 2020-08-29 17:36:48 并被添加「python」标签,已有 54 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章