?1.什么是異或?
異或:對于二進制,相同為0 不同為11 ⊕ 1 = 00 ⊕ 0 = 01 ⊕ 0 = 10 ⊕ 1 = 1
2.異或的好處??
異或的好處?1.快速比較兩個值 2.xor a a例如 a = 3 011xor 0110003.可以使用 異或 來使某些特定的位翻轉【原因】① 0 與 1 異或為 1 ② 1 與 1 異或為 0說明了 0或者1 只要與 1 做異或,得到的會是原值的相反值【例子】翻轉 1010 0001 的第6位,可以與0010 0000 進行異或運算1010 0001xor 0010 00001000 00014.使用 異或 來判斷一個二進制中 1 的數量是奇數還是偶數【例子】求 1010 0001中 1 的數量是奇數還是偶數1 ^ 0 ^ 1 ^ 0 ^ 0 ^ 0 ^ 0 ^ 1 = 1,結果為1就是奇數個1,結果為0就是偶數個15.校驗和恢復6.交換兩個值,在不使用其他空間的情況下a = a ^ b;b = a ^ b;a = a ^ b;7.二進制交換奇偶位① 取出所有的偶數位 ---- 與1010 1010 1010...相與,(用16進制表示0xaaaaaaaa)1的作用為偶數位保留,0的作用為奇數位全置0,將偶數位右移一位,偶數位到奇數位② 取出所有的奇數位——與0101 0101 0101……相與,(用16進制表示為0x55555555)奇數位保留,偶數位全為0,將奇數位左移一位,奇數位到偶數位③ 前兩步所得結果^(異或)操作——合并【例子】1001 交換奇偶位變為 01101001 1001& 1010 & 01011000 0001>> 0100 << 00100100xor 00100110偶數位右移一位,這時候偶數位就變成了奇數位,奇數位左移一位,這時候奇數位就變成了偶數位,再將他們按位或就交換完畢8.只出現一次的數給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素【原因】因為一個數出現兩次就會抵消為0
#include <iostream>
#include <vector>
using namespace std;// 1.快速比較兩個值
int test1(int a,int b) {if((a^b)== 0) return 1;else return 0;
}// 6.交換兩個值,在不使用其他空間的情況下
void swap(int &a,int &b) {// a = 3; b = 2;// a = 011 ^ 010 ==> 001 // b = 001 ^ 010 ==> 011 => 3// a = 001 ^ 011 ==> 010 => 2a = a ^ b;b = a ^ b;a = a ^ b;
}// 7.二進制交換奇偶位
int swapJiOu(int num) {int ou = num & 0xaaaaaaaa;int ji = num & 0x55555555;return (ou>>1)^(ji<<1);
}// 8.只出現一次的數
int singleNumber(vector<int> arr) {int single = 0;for(int num : arr) {single ^= num;}return single;
}int main() {int a = 3;int b = 2;if(test1(a,b))cout<<"兩值相等"<<endl;else cout<<"兩值不相等"<<endl;cout<<"a的值是: " << a <<" ,b的值是: " << b <<endl;swap(a,b);cout<<"a的值是: " << a <<" ,b的值是: " << b <<endl;cout<<swapJiOu(9)<<endl;vector<int> arr={4,1,2,1,2};cout << singleNumber(arr) <<endl;// 0100 4// xor 0001 1//---------------// 0101 // xor 0010 2 //---------------// 0111 // xor 0001 1//---------------// 0110 // xor 0010 2 // 0100 4return 0;
}
打印如下:?
heheda@heheda:~/Linux/內存對齊$ g++ xor.cpp -o app
heheda@heheda:~/Linux/內存對齊$ ./app
兩值不相等
a的值是: 3 ,b的值是: 2
a的值是: 2 ,b的值是: 3
6
4