一 前言
位运算,一个极容易被低端码农忽视的地带,因为它略微需要用一丢丢智商,真的只有那么一丢丢,但高手与low手的差距往往就是长这么一丢丢,能达到的深度就截然不同了,今天egon就来给大家聊一聊位运算那些风骚且高级的操作,但要理解位运算,得从机器数与真值说起,请看大屏幕
二 真值、机器数(原码、反码、补码)
“真值”指的就是数本身,例如-10,真值就是-10
一个数在计算机中的二进制表示形式,叫做这个数的机器数
在计算机中,用来表示有符号数的机器数有三种,即原码、反码、补码
三种表示方法均有“符号位”和“数值位”两部分
整型数字有8位、16位、32位、64位几种,篇幅问题,我们先单以8位整型为例来介绍
在介绍之前,egon先来先扫一下盲,估计会扫死99%的人
ok,我们接下来就在8位二进制数,即-128~127的范围内取值来介绍它的原码、反码、补码
为了大家能够清晰地看到”真值“与”补码“之间的相互转换,egon画了如下两幅图
在计算机系统中,数值一律用补码来存储 !!! 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理,需要注意的是两个用 补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃,处理完后我们如上图所示用补码反推出真值即可,例如计算机在计算8-3的时候,会这么做8+(-3),具体如下
练习:8+(-9)
非常震撼人心的设计,有了补码以后,减法都可以当做加法去运算,你可知道,这将极大地简化计算机的运算设计。不仅如此!!!
我们即将介绍的位运算也都是基于补码进行的,所以,你还会觉得egon在啰嗦吗?呵呵
三 位运算
####3.1 按位与&
示例1:8 & -3
示例2:-8 & -9
####3.2 按位或|
示例1:-8 | -9
####3.3 按位异或^
示例1:-8 ^ -9
示例2:^ -8 单独一个^代表取反的意思(适用于go,不适用于python)
####3.4 向左位移<< n
示范1:-8 << 3
####3.5 向右位移>> n
示范1:-8 >> 3
示范2:8 >> 3
示范3:-300 >> 8
四 位运算高级操作
位运算是 cpu 直接支持的,效率最高,位运算可能在平常的编程中使用的并不多,但涉及到底层优化,一些算法及源码可能会经常遇见,下面来介绍一下风骚的操作
####4.1 用位运算 & 取代 % 取模
示范1:
示范2:
####4.2 将一个数左移 n 位,相当于乘以了 2 的 n 次方,右移n位,相当于除以2的n次方取整
4.3 判断奇偶
4.4 交互数值
####4.5 项目中的应用
在项目中可以用位运算进行一些状态的运算,效率极其高,例如:现在我们有一些爱好需求,这些爱好有 足球 羽毛球 乒乓球 篮球 游泳 如果按照整数的形式去定义,那就有无数多种情况,毕竟可以两两组合嘛,python中的列表、go中的数组都不是最佳选择
可以直接用二进制位表示,1代表爱好,0代表没有该爱好
接下来就可以用位运算进行一些风骚的操作啦,例如
#####应用1:检查是否存在某个爱好
#####应用2:添加某个爱好
应用3:移除某个爱好
以上风骚操作均适用于python!!!egon忙忙叨叨写了一天,希望能够帮助到你