关于位运算相关知识总结
一,“”&“”按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。("1&1=1","1&0=0","0&0=0")
(可以判断奇偶数,3&1=1,4&1=0,奇数&1为1)
二,“”|“”按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1,否则为0。(“1|0=1”,“1|1=1”,“0|0=0”)
三,“”^“”按位异或运算符:当两对应的二进位相异时,结果为1,否则为0。(“0^0=0”,"1^1=0")
(当计算两个二进制数相加时,异或后==0,说明要么进位(1+1),要么为两位都是0)
四,“”~“”按位取反运算符(单目):对数据的每个二进制位取反,即把1变为0, 把0变为1。
五,“”<<“”左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
(左移相当于x乘2,左移几位,就是x乘2的几次方)
六,“”>>“”右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数
(右移相当于x除以2,右移几位,就是x除以2的几次方)
下面放两个经典例题
1.使用位运算实现两数相加
class Solution:
def addBinary(self, a: str, b: str) -> str:
x,y=int(a,2),int(b,2)
while y:
//x异或y,得到他们没有进位的和
ans=x^y
//temp我们只在意他是否有进位产生。我们用x&y,则1,1时,向上一位进1,即左移一位。
temp=>(10),说明进位了
temp=(x&y)<<1
//把没有进位的情况赋给x,把进位情况赋给y,知道两个数再没有进位发生,说明相加完成
x,y=ans,temp
return bin(x)[2:]
2.矩阵幂方法求解斐波那契数列
这个解法比较复杂,仅仅是展示中间的用& 与运算求奇偶数部分,和用右移n>>去代替n//2的操作。
##矩阵幂斐波那契数
class Solution:
def fib(self, n: int) -> int:
MOD = 10 ** 9 + 7
if n < 2:
return n
def multiply(a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
c = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % MOD
return c
def matrix_pow(a: List[List[int]], n: int) -> List[List[int]]:
ret = [[1, 0], [0, 1]]
while n > 0:
//1.若为奇数,需多乘一次 base
//2.若power除到1,乘积后得到res
//此处使用按位与运算在于效率高(相当于计算n是否为奇数)
if n & 1:
ret = multiply(ret, a)
//此处按位右移(相当于n整除2,右移一位,整除2的一次方)
n >>= 1
a = multiply(a, a)
return ret
res = matrix_pow([[1, 1], [1, 0]], n - 1)
return res[0][0]
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof/solution/fei-bo-na-qi-shu-lie-by-leetcode-solutio-hbss/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。