位运算基础
身为一个算法小白,浅浅谈一下位运算,如果有什么错误的地方请各位大佬指教
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的内容。
653

被折叠的 条评论
为什么被折叠?



