浅谈一下位运算

位运算基础

身为一个算法小白,浅浅谈一下位运算,如果有什么错误的地方请各位大佬指教
1.二进制与位运算
2.异或运算的各种nb操作
3.位运算的各种nb操作
4.位运算实现加减乘除操作
5.位图的实现

1.二进制与位运算

二进制
任意一个十进制的数都可以表示成一个二进制数,例如10,可以表示成1010
位运算
位运算可以说是计算机底层实现计算的方法,加减乘除等一系列运算都是由位运算拼接而成的,所以说位运算是运算的基础,并且位运算比其他运算快的多,因此可以节省大量的常数时间
常用的位运算:|,&,^,>>,<<,>>>

2.异或运算的nb操作

异或运算作为最重要的位运算操作,可以说它本身是非常重要的,并其它本身有许多nb的操作,当我们学习完这些操作后会令我们流连忘返,现在让我们看一下
性质1:异或运算满足交换律与结合律
性质2:a^ 0=a; a^a=0;
性质3:若a^ b=c 则b=a^c , c=a^b;
对于异或运算我们可以理解成无进位的二进制加法
下面我们给出一个leetcode上的题目来体会一下异或运算的奇妙之处
leecode :丢失的数字
思路:这一题就充分的展现了异或和的巧妙性
1.首先我们把0-n的数字进行异或和处理得到a
2.在将数组中的数进行异或和处理得到b
3.由题目我们可知目标数c,c^b=a, 再由异或的性质得到c=a^b
因此我们就可以得出目标c的值
4.下面我们看code

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int len=nums.size();
        int a,b,c;a=b=0;
        for(int i=0;i<=len;i++)
        a^=i;
        for(int i=0;i<len;i++)
        b^=nums[i];
        c=a^b;
        return c;
    }
};

然后我们再看一个很经典的题目,再来体会一下异或运算的精妙之处
该题为leetcode “只出现一次的数字”
思路:其实这一题可以进一步扩展,这一题可以表示为其中一个元素出现奇数次,其余元素均出现偶数次,返回这个出现奇数次的数
我们可以这样想:在该数组中出现偶数次的数全部异或后的结果0,出现奇数次的数,该奇数可以表示为一个偶数+1,也就是出现奇数次可以看成它出现了偶数次然后又出现了1次,所以我们将这个数组中的数全部异或后得到的数就是目标数
下面我们看一下code

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans=0;
        for(int i=0;i<nums.size();i++)
        ans^=nums[i];
        return ans;
    }
};

这次我就介绍到这里,下次再介绍3,4,5的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值