性质
-
&与:相同为1 例:101&111 = 101。
-
|或:有1就是1 例:100 | 011 =111。
-
^异或:不同为1 例:101 ^ 011 =110。
记一道简单应用题目:
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。
找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。( 力扣260)。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xornum{};
for(int num:nums){
xornum^=num;
}
//所有结果异或 相同值为0,所以结果是两个不同数的异或值。
int type1{},type2{};
//(x&(-x))得到的是低位最早出现的1
//异或值在这一位为1,证明一个数是1另一个数这一位是0。将数组分为两类
//通过与(x&(-x))与&一下,分为这一位为1的数和为0的数。
int lsb =xornum==INT_MIN?xornum : xornum&(-xornum);
for(int num:nums){
//分别异或和。因为出现两次的数这一位必定相同 ,两个相同的数异或结果为0。
//即可得到最终结果
if(num&lsb){
type1^=num;
}
else{
type2^=num;
}
}
return {type1,type2};
}
};