python查缺补漏——位运算

我一直用python写程序,但很少有接触到位运算和异常,今天来查缺补漏一下

位运算与进制表示

数字和指令在电脑中以二进制的方式存储,但具体怎么存储的就得谈到下面三个码了

原码:区分二进制数的正负号

按道理来说应该是原码直接存放的
对于原码来说
正数:直接进行二进制转换
0=0000000
1=0000001
2=0000010
9=0001001
负数:先把负号去掉进行二进制转换,然后把转换后的数字的位全部取反然后在把前面的全部数字改为1 内存单位的第一个bit位为负号位
就比如-1042
我们很容易求出1042的原码(以下都是)
010000010010
0010000010010
00010000010010
000010000010010
再把前面全部数字改成1即(以下都是)
111110000010010
11110000010010
1110000010010
110000010010
都是-1042的原码了
它就像-0001=-1 0002=2一样 取决于你想显示多少个
你可以把前面的全部的111理解为一个负号
但实际上0与1交接的前一个数是你的最高位数,这个是很好的区分办法

反码 易于计算机与电路得出计算结果

正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
还是这个例子

我们拿到了1042的原码
11111 10000010010
符号位 数
把数取反
得到
11111 01111101101
符号位 数

补码

因为有正0和负0的存在,以及计算的会出现问题,具体请翻阅资料。
计算完反码之后需要将其+1
也就是说 算到最好的补码为
11111 01111101110
符号位 数
所以计算机中-1042=(N个1)01111101110 N取决于单位内存大小

python中二进制数的表示

在python中二进制数前加0b代表为二进制数
0b100代表4 也可以用bin(4) 来获取4对应的二进制

python中数的运算

按位非 (~)

连着符号位一起取反

一个字节 (8位二进制)内存中有数字+120 存储为
0 1111000
0为符号位
~ 0 1111000 =1 0000111
即 ~120=-121

按位与(&)

按位数作与操作 即相同位1不同为0

一个字节 (8位二进制)内存中有数字+120 存储为 0 1111000
一个字节 (8位二进制)内存中有数字+10 存储为 0000 1010
01111000 & 00001010 =00001000
即 120&10=8

按位或(|)

按位数作或操作 有1就为1

一个字节 (8位二进制)内存中有数字+120 存储为 0 1111000
一个字节 (8位二进制)内存中有数字+10 存储为 0000 1010
0111 1000 | 0000 1010 =0111 1010
即 120|10=122

按位异或(^)主要记住’异’字 异=1

异或一直是我记不住的内容 这次一定要记住 攻克
异或 只有两个对应位不同时才为 1

一个字节 (8位二进制)内存中有数字+120 存储为 0 1111000
一个字节 (8位二进制)内存中有数字+10 存储为 0000 1010
120 ^ 10=0111 1000 ^0000 1010=01110010

左移(<<N)与右移(>>N) 左移或右移N位


9在4位内存里的左移

9= 1001
9<<1=0010=2
9= 1001
9<<2=0100 =4
9= 1001
9<<3=1000= 8
橙色的0是被扔掉的
红色的0是后来填充进来的

9在8位内存里的左移(被扔掉的都是0,我就不写出了)
9<<1=0001 0010 =18
9<<2=0010 0100 =36
9<<3=0100 1000= 72
就是全部二进制的数字往左移 如果内存太小了放不下的话 溢出的都扔了 新加进来的拿0填充
右移也是一样的

一个小坑

Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号。
即bin(-13)=’-0b1101’而不是补码’11110011’

一些使用范例

用位移实现对2的除法与乘法

我们都知道计算机是拿循环的加法和减法来实现乘法和除法的,学习了左移和右移,可以一步到位地实现与2的除法和乘法
例子
1200/2可写为1200>>1
1200/16可写为1200>>4
123*8可写为123<<3

n << 1 ====>计算 n^2^
n >> 1 ====> 计算 n/2,负的奇数不能用这个公式来算
n << m ====> 计算 n*(2^m^),n乘以 2 的 m 次方
n >> m ====> 计算 n/(2^m^),n除以 2 的 m 次方
1 << n -> 2^n

通过 ^ 快速交换两个整数。 通过 ^ 快速交换两个整数。

a ^= b
b ^= a
a ^= b

运用a & (-a)求出最后一位为1位置

00000101 &11111011 = 5 & - 5 =1
00001110 &11110010 = 14 & - 14 =2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值