前言:
今天看书,看到位运算的介绍,哇,发现位运算可有用,不过还不是很理解,记录下来
用法一
在不开数组的情况下,找一列数中只出现一次的数:
利用
num^num = 0; num^0 == num;
先初始化一个变量num = 0,再一个个的用数组里的数跟该数异或。
不过,我觉得应该是还有位运算可以交换运算顺序的缘故。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int i=0; i<nums.size(); i++)
{
ans^=nums[i];
}
return ans;
}
};
用法二
判断是否为2的次方
如果一个数是2的次方,那么该数的二进制数肯定为以下形式
0000..100....
然后将该数设为n, 则n-1为
0000...11....
两数按位与,则等于零
n&(n-1) = 0; //来判断一个数是否为2的次方
书上还有可以来判断是否为4的次方,是这么说的,
如果这个数也是 4 的次方,那二进制表示中 1 的位置必须为奇数位。我们可以把 n 和二进制的 10101...101 (即十进制下的 1431655765 )做按位与,如果结果不为 0 ,那么说明这个数是 4 的次方。
说明可以利用
n > 0 && !(n & (n - 1)) && (n & 1431655765); //来判断是否为4的次方
对于这个判断,我还不是很理解,能有大佬能解释一下吗?
用法三
判断两个字符串,是否出现相同的字母
为每个字符串的26个字母建立一个长度为26的二进制数,然后将两个数按位与,若按位与为0,则两个字符串中没有相同的字母。
用法四
求二进制表示数的1在的最高位
int highbit=0;
for (int i=0; i<=30; i++)
{
if ((1<<i)&num)
highbit = i;
}
将一个二进制表示的数置为000...11111
(1<<(highbit+1))-1
求一个数的补数
class Solution {
public:
int findComplement(int num) {
int highbit=0;
int ans=0;
for (int i=0; i<=30; i++)
{
if ((1<<i)&num)
highbit = i;
}
ans = highbit==30 ? 0x7fffffff: (1<<(highbit+1))-1;
return ans^num;
}
};