成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

異或運算常見的應用

開發 前端
大家可能比較熟悉 "與" 運算 和 "或" 運算 ,相對而言, "異或" 運算 平常使用較少,存在感也不強,如果不是刻意提起,可能還想不到它。

[[434244]]

大家可能比較熟悉 "與" 運算 和 "或" 運算 ,相對而言, "異或" 運算 平常使用較少,存在感也不強,如果不是刻意提起,可能還想不到它

其實,"異或" 運算也非常重要,它在加密、備份、算法等方面都有應用,每一位開發的同學都應該花點兒時間掌握它的特點和規律,以便在日常工作中能靈活的運用

接下來將介紹異或運算的一些基礎知識以及在實際中的一些應用

基礎知識

異或是計算機中一種二元邏輯運算, 運算符號是 ^,它按照二進制位進行異或運算,結果為 真 或 假, 它的運算法則如下

x y x^y
0 0 0
0 1 1
1 0 1
1 1 0

表格 第一列 和 第二列 是異或運算的兩個操作數,第三列是異或運算的結果,1 表示真,0 表示假

由表格可知:如果參與運算的兩個二進制位相同,則結果為 0 ,否則為 1

也就是說,異或主要用來判斷兩個值是否相同

重要的性質

下面列出異或運算一些重要的性質,1 表示真,0 表示假, 具體的驗證過程比較簡單,這里就省略了

1、一個數與自身異或,總是為 0

  1. x ^ x = 0 

2、 一個數與 0 異或,總是其自身

  1. x ^ 0 = x 

3、 交換性

  1. x ^ y = y ^ x 

4、 結合性

  1. x ^ ( y ^ z ) = ( x ^ y ) ^ z 

常見應用

異或運算本身比較簡單,重點還是在應用層面,上面列出的性質,在很多方面都有應用

  • 判斷兩個數是否相等

一個數與自身異或,總是為 0,我們可以使用這一點來判斷兩個變量是否相等

  1. ( a ^ b ) == 0 

當 a 和 b 相等時,表達式為真,否則為假

  • 不使用臨時變量交換兩個數的值

要交換兩個數的值,通常做法是借助一個臨時變量,然后再進行交換,比如:tmp 是臨時變量,現需要交換 a 和 b 兩個變量值,過程如下

  1. tmp = a 
  2. a = b 
  3. b = tmp; 

利用異或的一些性質,不用臨時變量也能實現交換兩個數的值,具體過程如下

  1. a = a ^ b 
  2.  
  3. b = a ^ b 
  4.  
  5. a = a ^ b 

假如初始時,a = 1、b = 2

第一個等式 a = a ^ b 結果是 a = 1 ^ 2 = 3

緊接著第二個等式 b = a ^ b 結果是 b = 1 ^ 2 ^ 2 = 1 ^ 0 = 1

最后一個等式 a = a ^ b 結果是 b = 1 ^ 2 ^ 1 = 1 ^ 1 ^ 2 = 0 ^ 2 = 2

可以看到,最終 a = 2、 b = 1 ,它們的值實現了交換

上面的三條語句還可以進一步優化成一條,結果如下

  1. a ^= b ^= a ^= b 
  • 簡化表達式

根據交換性,可以優化表達式中重復變量的異或運算,比如:表達式 a ^ b ^ c ^ a ^ b 可以做如下簡化

  1. a  ^  b  ^  c  ^  a  ^  b                   # 根據 x ^ y  = y ^ x 
  2.  
  3. =  ( a  ^  a )  ^  ( b  ^  b )  ^  c        # 根據 x  ^ x = 0 
  4.  
  5. =  0  ^  0  ^  c                            # 根據 x ^ 0 = x 
  6.  
  7. = c 
  • 加密

利用異或運算加密是很常見的加密手段,它涉及到三個變量:明文、密鑰、密文,假如它們分別記為 plain_text、 encrypt_key、 cipher_text

明文和密鑰進行異或運算,可以得到密文

  1. plain_text ^ encrypt_key = cipher_text 

密文和密鑰進行異或運算,可以得到明文

  1. cipher_text ^ encrypt_key  
  2. = ( plain_text  ^  encrypt_key ) ^ encrypt_key 
  3. = plain_text  ^ ( encrypt_key ^ encrypt_key )   # 根據 x ^ ( y ^ z ) = ( x ^ z ) ^ y 
  4. = plain_text  ^  0                              # 根據 x ^ x = 0 
  5. = plain_text 
  • 備份

根據異或的性質,異或運算還可以用于文件的備份

現有兩個文件 filea 和 fileb,它們進行異或運算,會產生一個新的備份文件 bakfile

  1. bakfile = filea ^ fileb 

根據異或的性質,可以通過 bakfile 和 filea 得到 fileb,或者通過 bakfile 和 fileb 得到 filea

后面無論是 filea 或 fileb 文件損壞了,只要不是兩個文件同時損壞,都可以通過兩者中未損壞的文件 和 bakfile 文件,還原得到另一個文件

當 filea 文件損壞了,可以通過 fileb 和 bakfile 進行異或運算得到完好的 filea 文件

  1. fileb  ^  bakfile 
  2. =  fileb  ^ ( filea  ^  fileb ) 
  3. =  fileb  ^  filea  ^  fileb        # 根據 x ^ ( y ^ z ) = ( x ^ z ) ^ y 
  4. =  fileb  ^  fileb  ^  filea        # 根據 x ^ x = 0 
  5. =  0  ^ filea                       # 根據 x ^ 0 = x 
  6. =  filea 

同樣,當 fileb 文件損壞了,可以通過 filea 和 bakfile 進行異或運算得到完好的 fileb 文件

f

  1. filea  ^  bakfile 
  2. =  filea  ^ ( filea  ^  fileb ) 
  3. =  filea  ^  filea  ^  fileb        # 根據 x ^ ( y ^ z ) = ( x ^ z ) ^ y  
  4. =  filea  ^  filea  ^  fileb        # 根據 x ^ x = 0 
  5. =  0  ^ fileb                       # 根據 x ^ 0 = x 
  6. =  fileb 

解算法題

有些算法可以利用異或的思路進行求解,下面列出力扣上的一道算法題來說明,題目如下:

  1. 一個長度為 n-1 的遞增排序數組中的所有數字都是唯一的,并且每個數字都在范圍 0 ~ n-1 之內, 
  2.  
  3. 在范圍 0 ~ n-1 內的 n 個數字中有且只有一個數字不在該數組中,請找出這個數字 
  4.  
  5.  
  6. 示例 1: 
  7.  
  8. 輸入: [ 0,1,3 ] 
  9.  
  10. 輸出: 2 
  11.  
  12.  
  13. 示例 2: 
  14.  
  15. 輸入: [ 0,1,2,3,4,5,6,7,9 ] 
  16.  
  17. 輸出: 8 

最快捷的解決方法是把數組的所有元素以及 0 到 n-1 之間的整數 全部進行異或運算

  1. arry[0] ^ arry[1] ^ arry[2] ... ^ arry[n-2] ^ 0 ^ 1 ^ 2 .... ^ (n-1) 

由于數組元素值范圍在 0 到 n-1,且所有元素值都沒有重復

所以,上述的計算式子中,0 到 n-1 每個數會出現兩次,只有缺少的那個數僅出現一次,根據異或的性質 x ^ x = 0 可知,相同值之間的異或運算等于 0,因此算式的結果其實就是缺少的那個數

下面給出測試文件 test.cpp,代碼是用 C++ 實現的,可以自行用其他語言實現

  1. #include <stdint.h> 
  2. #include <iostream> 
  3. using namespace std; 
  4.  
  5. int32_t find_missing(int32_t *ary, int32_t len) 
  6.     //數組長度小于等于1,直接返回 -1 
  7.     if(len <= 1) 
  8.     { 
  9.         return -1; 
  10.     } 
  11.     //結果 
  12.     int32_t result = 0; 
  13.     //result 和 數組中每一個元素值進行異或運算 
  14.     for (int32_t i = 0; i < len; i++) 
  15.     { 
  16.         result ^= ary[i]; 
  17.     } 
  18.     //result 和 0 到 n 中每一個值進行異或運算 
  19.     for (int32_t j = 0; j <= len; j++) 
  20.     { 
  21.         result ^= j; 
  22.     } 
  23.     return result; 
  24. //編譯: g++ -g -o test  test.cpp 
  25. int32_t main(int32_t argc , char *argv[]) 
  26.     int32_t ary[] = { 0, 1, 3 }; 
  27.     int32_t result = find_missing(ary, sizeof(ary) / sizeof(int32_t)); 
  28.     std::cout << "result = " << result << std::endl; 
  29.      
  30.     return 0; 

使用 g++ -g -o test test.cpp 命令編譯,接著運行程序,結果如下:

  1. [root@localhost test]# ./test  
  2. result = 2 

當然,這道題目還有其他的解法,比如:利用加法來解,大家自己去思考下,這里不做介紹了

題目鏈接 https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

小結

通過上文,我們可以看到,異或運算在很多方面都有應用,其實,它的應用遠不止文中介紹的方面,所以,我們花時間去掌握它是非常值得做的一件事

 

責任編輯:武曉燕 來源: Linux開發那些事兒
相關推薦

2022-05-18 16:06:15

位運算異或運算

2022-05-23 15:02:19

異或運算面試真題

2017-08-29 09:40:26

JavaScript代碼神經網絡

2012-10-26 11:37:12

2021-08-06 10:26:14

蜂窩物聯網物聯網IOT

2012-02-02 15:24:57

2023-02-03 16:16:34

物聯網

2010-11-23 15:42:14

2022-10-26 14:55:53

AIoT物聯網人工智能

2010-01-04 15:12:27

Silverlight

2012-02-22 20:46:24

金萬維異速聯

2018-07-29 15:27:04

AI訓練光速運算人工智能

2021-02-21 06:36:57

運算技巧按位

2012-07-25 15:56:07

2017-12-19 10:03:44

JavaLinux代碼

2010-03-05 16:38:48

Python應用范圍

2021-07-26 11:30:21

Wine開發者補丁

2013-05-08 11:01:35

BYODPC應用IT系統

2023-02-15 11:58:29

2018-05-28 08:28:24

云計算應用場景
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久99久久98精品免观看软件 | 国产中文一区二区三区 | 毛片免费在线 | 久久黄色精品视频 | 97人澡人人添人人爽欧美 | 成人免费视频观看 | 波多野结衣在线观看一区二区三区 | 激情五月综合网 | 国产精品精品视频一区二区三区 | 国产精品久久久久久久久久久久 | 日韩欧美视频在线 | 黄色av观看 | 欧美精品一区二区三区蜜桃视频 | 日韩一区二区成人 | 在线91 | 亚洲免费片 | 国产精品日韩 | 日韩www视频 | 欧美久久一区 | 久久精品二区 | 欧美美女一区二区 | 国产成人99久久亚洲综合精品 | 高清色视频 | 青青草网站在线观看 | 久久综合久色欧美综合狠狠 | 国产精品久久久久免费 | 美女在线观看国产 | 国产一级成人 | 97超碰人人| 日本精品一区二区 | 国产美女在线看 | 热久久久久 | 欧美激情国产精品 | www.久久久久久久久久久久 | 亚洲女人天堂成人av在线 | 国产91久久久久久 | 少妇一级淫片免费播放 | 欧美日韩精品 | 国产99久久精品一区二区300 | 国产精品综合一区二区 | 在线区 |