1、位运算是计算机核心的基础,数据的表示和计算基本少不了,两个数字进行可以使用与、或、异或和取反等操作,改变当前数字的值,也可以进行移位计算(左移或者右移),移位计算按照是否带符号可以分成算术移位和逻辑移位。左移运算符号是<<,左移运算时,将全部二进制位向左移动若干位,高位丢弃,低位补0,对于左移运算,算术移位和逻辑移位是相同的。右移运算的符号是>>,右移运算时,将全部二进制位向右移动若干位,低位丢弃高位的补位由算术移位或逻辑移位决定:算术右移时,高位补最高位;逻辑移位时,高位补0。
2、移位运算可以实现乘除操作,计算机底层一切运算都是基于位运算实现的,左移运算相当于乘法操作,左移K位,等价于将这个数乘以2^k,右移运算相当于除法操作,右移K位,相当于除以2^K,结果向下取整。
3、位运算还有很多性质,例如幂等律、交换律、结合律、分配律,德摩根定律、取反运算性质等,也可以利用性质获取、设置和更新某个为的数据,如:
获取,该方法是是将1左移i位,得到形如00010000的值,接着与num执行“位与”操作,从而获取指定位置的值。
def get_bit(num,i):
return (num & (1 << i)) ! = 0
设置,也是将1左移i位,得到形如00010000的值,接着与num执行“位或”操作,这样就可以将指定位置的值设置为1,其余位不变。
def set_bit(num, i):
return num | (i << i)
清零,将1左移i位,得到形如00010000的值,再取反得到11101111,接着与num执行“位与”操作,从而获取指定位置的值设为0,其余位不变。
def clear_bit(num, i):
mask = ~ (1 << i)
return num & mask
更新,这个方法是将设置和清零结合,首先将指定为清零,后将需要设置的值左移到指定位置进行“位或”操作。
def update_bit(num, i, v):
mask = ~(1 << i)
return (num & mask) | (v << i)