leetcode上的位运算
136-只出现过一次的数字
思路:可以考虑到数字以二进制形式存储,当两个不同的数字异或的时候会是true,所以把数组里的数字都一一处理一遍就可以了。
class Solution { public: int singleNumber(vector<int>& nums) { int res=0; for(auto num:nums) res^=num; return res; } };
201-数字范围按位与
思路:m和n每次向右平移一位直到相等为止,记录下平移的次数i,然后让m往左平移i位即为所求
class Solution { public: int rangeBitwiseAnd(int m, int n) { int i=0; while(m!=n){ m>>=1; n>>=1; i++; } return (m<<i); } };
477-汉明距离总和
思路:规律查找发现,每一位上1的数量乘于0的数量就是当前位的结果,然后统计相加就可以得出结果了。
class Solution { public: int totalHammingDistance(vector<int>& nums) { int res=0,n=nums.size(); for(int i=0;i<32;i++){ int cnt=0; for(int num:nums){ if(num&(1<<i)) cnt++; } res+=cnt*(n-cnt); } return res; } };
421-最大异或值
思路:
868-二进制间距
思路: