位运算相关总结

关于位运算相关知识总结

一,“”&“”按位与运算符:参与运算的两个值,如果两个相应位都为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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值