Python 中的位运算-基础知识

目录

1、编码基础知识-原码、反码、补码

1.1 原码

1.2 反码

1.3 补码

2、Python 中的位运算

2.1 左移运算符(<<)

2.2 右移运算符(>>)

2.3 按位与运算(&)

2.4 按位或运算(|)

2.5 按位取反运算(~)

2.6 异或运算符 (^)


1、编码基础知识-原码、反码、补码

        Python 是一种比较高级的语言,但是也支持基本的位运算。要知道位运算,首先要了解基本的计算机知识。我们在程序中经常使用的整数,在计算机中的表示形式是二进制,这个数其实就叫机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0, 负数为1。

        存储的二进制码又分原码、反码、补码,计算机都是用补码存储,在计算的时候,如果是减法,可以把减法看成加法。

1.1 原码

        原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如在某些计算机语言中有较短的数值,例如 8 位二进制,正数数字 5,原码即 101,数字 11 原码即 1011。 它和十进制的转换即 11 等于 1*2**(4-1)+1*2**(2-1)+1*2**(1-1)。

        如果是无符号位,那么 8 位二进制的范围为 0~ 255(2**8)。

        如果是有符号位,那么 8 位二进制的范围为 -127 到 127。

        如果是16 位二进制或者 32 位,其能表达的范围依次类推,这是人脑非常好理解的一种编码方式。

1.2 反码

        反码,顾名思义是对其取反。正数的反码就是自身,负数的反码除符号位外,其他各位求反。对于正数,反码和原码一致,不需要修改。对于负数,保留符号位,其余位取反。

        例如 数字 11,8 位二进制表示的原码是 00001011,反码即 00001011,数字 -11 原码是1001011反码即 11110100。

        请注意,如果是 32 位或者 64 位,那么二进制长度和 8 位二进制长度是不一样的。本文未注明的以 8 位二进制来表达,因为这样简单。

1.3 补码

        补码,正数的补码和原码、反码一样。而负数的补码,则在反码的基础上+1。

        如数字 -11,原码是10001011,反码即 11110100,补码是 11110101。

        计算机中,使用补码代表正负数,而不是原码或者反码。使用补码可以把减法或负数,转换为加法运算,从而简化计算机的硬件。

2、Python 中的位运算

        Python中,按位运算符有左移运算符(<<)、右移运算符(>>)、按位与运算(&)、按位或运算(|)、按位取反运算(~)、异或^运算符,其中按位取反运算符为单目运算符。

        Python 中的整数,不受底层硬件字节数的限制,一般情况 int 都是 4 个字节。如果两个整数实际所占用的 byte 数不一致时,以大的那个为准;

2.1 左移运算符(<<)

        左移动运算符的步骤:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补 0。对于有符号数,符号数不变。

        如 数字 -11,补码是 11110101,向移动两位,即 11010100。这个补码减去 1,即11010011,再取反 10101100,即 -44 。请注意,我此处以 8 bit 举例,实际计算机存储中不一定是 8 bit,但是不影响结果。

>>> a=11
>>> bin(a)
'0b1011'
>>> b=a<<2
>>> b
44
>>> bin(b)
'0b101100'
>>> a=-11
>>> b=-11<<2
>>> b
-44

2.2 右移运算符(>>)

        右移动运算符的步骤:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。对于有符号数,符号数不变。

        如 数字 -11,补码是 11110101,向移动两位,即 11111101。这个补码减去 1,即11111100,再取反 10000011,即 -3 。请注意,我此处以 8 bit 举例,实际计算机存储中不一定是 8 bit,但是不影响结果。

>>> a=11
>>> b=a>>2
>>> b
2
>>> a=-11
>>> b=a>>2
>>> b
-3

2.3 按位与运算(&)

        按位与运算符的步骤:对应的二个二进位都为 1 时,结果位就为 1,否则为 0。

>>> 0b11110101&0b1100
4
# 4 是正数,补码就是原码 即 0b0100

        请注意,此处有一个非常重要的知识点,即 python 中 int 类型到底是占领几个字节。

        假如想看-11 实际占据几个字节,可以使用 sys.getsizeof 函数查看。Python 中一切都是对象,根本不存在 int float 这些类型,int 其实是一个 python 对象,这一点和 C/C++ 语言完全不一样。

>>> import sys
>>> sys.getsizeof(-11)
28

2.4 按位或运算(|)

        按位或运算符的步骤:只要对应的二个二进位有一个为 1 时,结果位就为 1,否则为 0 。

>>> bin(11)
'0b1011'
>>> bin(22)
'0b10110'
>>> bin(11|22)
'0b11111'
>>> 

2.5 按位取反运算(~)

        按位取反运算符的步骤:二进位为 1 时,结果位就为 0;二进位为 0 时,结果位就为 1 。

>>> bin(11&0xFFFFFFFF)
'0b1011'
>>> bin(~11&0xFFFFFFFF)
'0b11111111111111111111111111110100'

2.6 异或运算符 (^)

        异或运算符是对两个参数进行运算,按位异或运算符的步骤:两个二进位不相同,结果位就为 1;两个二进位相同,结果位就为 0 。

>>> bin(9)
'0b1001'
>>> bin(13)
'0b1101'
>>> bin(9^13)
'0b100'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南野栀子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值