這篇筆記是寫給那些像我一樣的小菜鳥的。提供了一種兩數交換的思路。可能有些地方寫的不全甚至不對,請多多包涵,多多指教。
交流使人進步,只有不斷交流才能走的更遠。
按位異或:
一:定義
異或運算:^。簡單點說就是異或的兩個值'相同為假,不同為真'。
抑或運算的一些規則原理:
1. 異或運算符合交換率。
2. 按位異或的3個特點:
(1) 0^0=0,0^1=1 0異或任何數=任何數
(2) 1^0=1,1^1=0 1異或任何數=任何數取反
(3) 任何數異或自己=把自己置0
二:異或運算法則:
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c
4. a ^ b ^ a = b
三:原理證明
下面是用按位異或運算子交換兩個數,不引入第三個變數。
交換a,b.假設a=9,b=10。9二進位制是1001,10在二進位制中是1010;
a=a^b;;1001
1010
0011,此時a為0011;
b=a^b;;0011
1010
1001,此時b為1001,10進製為9.成功一半了
a=a^b;;0011
1001
1010,此時a為1010,10進製的10,至此交換成功。
另外下面是從網上蒐集的資料,可以當作是資料儲存下來:
按位異或的幾個常見用途:
(1) 使某些特定的位翻轉
例如對數10100001的第2位和第3位翻轉,則可以將該數與00000110進行按位異或運算。
10100001^00000110 = 10100111
(2) 實現兩個值的交換,而不必使用臨時變數。
例如交換兩個整數a=10100001,b=00000110的值,可通過下列語句實現:
a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110
(3) 在組合語言中經常用於將變數置零:
xor a,a
(4) 快速判斷兩個值是否相等
舉例1: 判斷兩個整數a,b是否相等,則可通過下列語句實現:
return ((a ^ b) == 0)
舉例2:linux中最初的ipv6_addr_equal()函式的實現如下:
static inline int ipv6_addr_equal(const struct in6_addr *a1,const struct in6_addr *a2)
可以利用按位異或實現快速比較, 最新的實現已經修改為:
static inline int ipv6_addr_equal(const struct in6_addr *a1,const struct in6_addr *a2)
5應用通式:
對兩個表示式執行按位異或。
result= expression1 ^ expression2 引數
result
任何變數。
expression1
任何表示式。
expression2
任何表示式。 說明
^ 運算子檢視兩個表示式的二進位制表示法的值,並執行按位異或。該操作的結果如下所示:
0101(expression1)1100(expression2)----1001 (結果)當且僅當只有乙個表示式的某位上為1 時,結果的該位才為 1。否則結果的該位為 0。
只能用於整數
下面這個程式用到了「按位異或」運算子:
classe}
就是加密啊解密啊
char型別,也就是字元型別實際上就是整形,就是數字.
計算機裡面所有的資訊都是整數,所有的整數都可以表示成二進位制的,實際上計算機只認識二進位制的.
位運算就是二進位制整數運算啦.
兩個數按位異或意思就是從個位開始,一位一位的比.
如果兩個數相應的位上一樣,結果就是0,不一樣就是1
所以111^101=010
那加密的過程就是逐個字元跟那個secret字元異或運算.
解密的過程就是密文再跟同乙個字元異或運算
010^101=111
至於為什麼密文再次異或就變原文了,這個稍微想下就知道了..
按位異或學習筆記 兩數交換證明
這篇筆記是寫給那些像我一樣的小菜鳥的。提供了一種兩數交換的思路。可能有些地方寫的不全甚至不對,請多多包涵,多多指教。交流使人進步,只有不斷交流才能走的更遠。按位異或 一 定義 異或運算 簡單點說就是異或的兩個值 相同為假,不同為真 抑或運算的一些規則原理 1.異或運算符合交換率。2.按位異或的3個特...
使用異或實現兩數交換
如果a b兩個值不相同,則異或結果為1。如果a b兩個值相同,異或結果為0。異或也叫半加運算,其運算法則相當於不帶進製的二進位制加法 二進位制下用1表示真,0表示假,則異或的運算法則為 0 0 0,1 0 1,0 1 1,1 1 0 同為0,異為1 這些法則與加法是相同的,只是不帶進製,所以異或常被...
異或運算實現兩數交換
在 演算法競賽入門經典 第2版 p9,介紹了三種交換兩個數的方法。1 三變數法 incldueusing namespace std int main 2 不借助其他變數 incldueusing namespace std int main 3 異或運算 異或 是乙個數 算符。它應用於邏輯運算。異...