按位異或學習筆記 兩數交換證明

2021-08-26 13:53:31 字數 2326 閱讀 2865

這篇筆記是寫給那些像我一樣的小菜鳥的。提供了一種兩數交換的思路。可能有些地方寫的不全甚至不對,請多多包涵,多多指教。

交流使人進步,只有不斷交流才能走的更遠。

按位異或:

一:定義

異或運算:^。簡單點說就是異或的兩個值'相同為假,不同為真'。

抑或運算的一些規則原理:

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 異或運算 異或 是乙個數 算符。它應用於邏輯運算。異...