码迷,mamicode.com
首页 > 编程语言 > 详细

python位运算

时间:2019-03-30 23:53:55      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:port   class   多少   除法   正数   终端   手工   形式   计算过程   

什么是位运算

位运算就是把数字当成二进制来进行计算,位运算有六种:&(与), |(或), ^(异或), ~(非), <<(左移), >>(右移)

&(与)

&运算规则:两个位都为1,结果为1,否则为0

# &(与)
a = 3
b = 9
print(a & b)

# a----0101
# b----1001
# a&b--0001
# a&b=1


|(或)

|运算规则:两个位至少有一个为1,结果为1,否则为0

# |(或)
a = 3
b = 9
print(a | b)

# a----0101
# b----1001
# a|b--1101
# a|b=11


^(异或)

^运算规则:两个位不同,结果为1,否则为0

# ^(异或)
a = 3
b = 9
print(a ^ b)

# a----0101
# b----1001
# a^b--1100
# a^b=10


~(非)

~运算规则:对所有位取反,1变成0,0变成1

a = 5
print(~a)

猜猜结果是多少?是不是以为是2,哈哈哈
看一下打印结果

-6

what? 检查下计算过程

# a----101
# ~a--010
# ~a=2

按照运算规则,没错啊

这是为什么呢?其实,计算机中是以补码的形式来进行计算的

对于正数:
原码=反码=补码

对于负数:
反码=原码的符号位不变,其余位取反;
补码=反码+1

使用sys.getsizeof可以查看对象在内存空间占用的大小

import sys
a = 5
print(sys.getsizeof(a))  # 28

说明a在内存中占的位数是28

现在我们来一步一步等推算~a
a的二进制形式

0000  00000000  00000000  00000101



由于运算是以补码的形式进行,因此要将原码转化成补码,由于a为整数,因此其补码就等于原码

# a的补码
0000  00000000  00000000  00000101


对a的补码进行~运算,结果为

# 结果的补码
1111  11111111  11111111  11111010

到这里要注意了,计算机运算的时候是以补码的形式,但是显示到终端上还是以原码的形式,因此我们要把结果再转化回原码
由于结果为负数(符号为1),先把补码转化成反码,反码=补码-1

# 结果的反码
1111  11111111  11111111  11111001

再计算结果的原码

# 结果的原码
1000  00000000  00000000  00000110

再把结果的二进制转化成十进制形式,符号为1说明是负数,-(4+2)= -6,因此结果为-6
上面的计算过程只是让我们对计算机如何进行位运算有一个认识,实际上对于任意数a,~a = -(a+1),根本不用手工转化成二进制计算


<<(左移位)

<<的规则:运算数的各二进位全部左移若干位,由<< 右边的数字指定了移动的位数,高位丢弃,低位补0。

a = 9
print(a << 2)  # 36

对于整数a,a<<n等效于 a*2**n,也就是说移位运算可以替代乘法运算


>>(右移位)

‘>>‘的规则:运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数

a = 9
print(a >> 2)  # 2

对于整数a,a<<n等效于 int(a/2**n),向右移位可以代替除法运算

python位运算

标签:port   class   多少   除法   正数   终端   手工   形式   计算过程   

原文地址:https://www.cnblogs.com/zzliu/p/10629532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!