位运算总结
基本位操作(按位是从低往高比)
| 按位与& | 按位或 | | 按位异或^ | 按位取反~ |
|---|---|---|---|
| 0b1010 & 0b10 = 0b10 | 0b1010 | 0b10 = ob1010 | 0b1010 ^ 0b10 = 0b1000 | ~0b10 ?= ob01 |
按位取反是有问题的?
~1 -> -2 # 1 = 0b 0000 0001,取反 1111 1110, 转换位整数, 1000 0001 + 1 -> 1000 0010, 等于-2
~-1 -> 0 # bin(-1) = -0b1? -1 = 1000 0001(原码), 实际存储位补码1111 1111, 取反0000 0000 -> 0
~-2 -> 1 # -2 = 1000 0010(原码), 实际存储补码1111 1110, 取反0000 0001 -> 1
那该如何是好?
如果采用32bits存储,可以通过异或操作,12 ^ 0xffffffff
32bits: 整数取值范围-2^31 ~ 2^31-1, -2147482648 ~ 2147483647
怎么获取二进制中一的个数?
count = 0
while(n):
n = n & (n - 1) # 每次均把最后一个1给消除
count += 1
怎么获取数的某位是否为1?
count = [0] * 32
for i in range(32):
if n & 1 == 1:
count[i] += 1
n = n >> 1
有限状态机:找在出现三次的数集中出现一次的数
Python中常用的二进制库?
首选bin函数,bin(2) -> 0b10, bin(-2) -> -ob10, 故而若要单纯取有效数字则要使用bin(x)[2:] <- 正数, -bin(x)[3:] <- 负数!!
其次,有
位运算总结
https://blog.427221.xyz/archives/%E4%BD%8D%E8%BF%90%E7%AE%97%E6%80%BB%E7%BB%93