1. 程式人生 > >異或XOR的再理解以及在leetcode上的應用

異或XOR的再理解以及在leetcode上的應用

異或

0和0異或產生0,0和1; 1和0異或得到1;1和1異或得到0。
簡單總結:不同的產生1;否則0。代表的是差別。 補充AND,OR。

AND

0&0=0
1&1=1
0&1=0
只有兩個同時滿足才能滿足。

OR

0|0=0
1|1=1
0|1=1
只要有一個滿足就滿足。

再理解:異或的操作,如同生孩子,只有男女之間才能滿足結果;其他的無法滿足。

彙總

&   -  bitwise and
|   -  bitwise or
^   -  bitwise xor
~   -  bitwise not
<<  -
bitwise shift left >
> - bitwise shift right

性質

異或運算的簡單性質:
1. a ⊕ a = 0
2. a ⊕ b = b ⊕ a 交換律
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c; 結合律
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.
6. a ⊕ 0 = a

應用

找出兩個數有差異的位

a⊕b得到的結果中,1表示在該位兩數存在差別,0表示無差別,這個很好理解。
再來看a^b^a=b,a^b得到a和b有差別的位,在用這個結果異或a,相當於將a中把有差別的位都改變取值,改了自然就沒有差別了,就成了b。所以兩數交換的解釋應該可以同理。
例子:

https://leetcode.com/problems/hamming-distance/description/
The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and y, calculate the Hamming distance.
求解方法就可以用異或解決。 異或之後,數字裡有多少個bit=1則就是海明距離。

這裡寫圖片描述

求解方法放到了github上.

找出現一次的數

交換兩個整數的值而不必用第三個引數

利用性質5; a^(a^b) = b 進行交換;
演算法:

a = a^b; //a is xor, as diff
b = a^b; //b 減掉了ab之間的差異,那就變成a的值;交換成功
a = a^b; //b也就是原來a的值,減掉了ab的差異,那就變成了b;交換成功。

如果用中間變數可能更好理解這個概念:

diff = a^b
new_b = a^diff;
new_a = b^diff;

格雷碼(Gray code)

格雷碼是一個數列集合,相鄰兩數間只有一個位元改變,為無權數碼,且格雷碼的順序不是唯一的。特點就是任意一個數字的二進位制,和下一個數的二進位制只有一個bit的差異。 具有變換的穩定性,具有迴圈屬性。
leetcode上面的描述也非常清晰,我們引用一下

The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
00 - 0
01 - 1
11 - 3
10 - 2

求解方法:

第一種

這裡寫圖片描述

第二種

公式
 自然二進位制碼轉換成二進位制格雷碼,其法則是保留自然二進位制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進位制碼的高位與次高位相異或,而格雷碼其餘各位與次高位的求法相類似。
這裡寫圖片描述
公式為:
next_gray = gray ^ ( gray >>1)

總結

  1. 異或代表的是兩個變數之間的求差異的過程。
  2. 異或的性質用的最多的還是異或自己得到0, 0異或自己還是自己,這個性質。
  3. 格雷碼是異或的一種應用,滿足了數序列的變換穩定性。

參考文獻

相關推薦

XOR理解以及leetcode應用

異或 0和0異或產生0,0和1; 1和0異或得到1;1和1異或得到0。 簡單總結:不同的產生1;否則0。代表的是差別。 補充AND,OR。 AND 0&0=0 1&1=1 0&1=0 只有兩個同時滿足才

清北學堂模擬賽d1t6 (xor)

格式 ring 只需要 namespace clas 信心 using names update 題目描述 LYK最近在研究位運算,它研究的主要有兩個:or和xor。(C語言中對於|和^) 為了更好的了解這兩個運算符,LYK找來了一個2^n長度的數組。它第一次先對所有相鄰兩

按位的深入理解

int j = 8; p = j << 1; cout<<p<<endl; 在這裡,8左移一位就是8*2的結果16 。   移位運算是最有效的計算乘/除乘法的運算之一。   按位與(&)其功能是參與運算的兩數各對應的二進位制位相與。只有對應的兩個二進位制位均為1

php使用xor調換兩個變數的值的原理

1、首先,我們要知道什麼是異或,異或,簡單來說就是:相同的兩個數,異或的結果是0;不同的兩個數,異或的結果是1。 2、0和0,異或的結果是0。1和1,異或的結果是0。0和1,異或的結果是1。於是我們發現,在0和1的世界裡:A和B異或,結果是C;B和C異或的結果

通過抽象工廠模式理解java的轉型

最近在學習抽象工廠模式的時候,看到了他的優點之一---分離了具體的類。抽象工廠模式幫助你控制一個應用建立的物件的類,因為一個工廠封裝建立產品物件的責任和過程。 它將客戶和類的實現分離,客戶通過他們的抽象介面操縱例項,產品的類名也在具體工廠的實現中被分離,它們不出現在客戶程式碼中。 一個抽象的工廠的介面 pub

MySQL的比較運算子 BETWEEN 和 IN,邏輯運算子 XOR

“BETWEEN”運算子的使用格式為”a BETWEEN min AND max”,當a大於等於min並且小於等於max,則返回值為1,否則返回值為0;當運算元a,min,max型別相同時,此表示式等價於(a>=min and a<=max),當運

[LeetCode] Maximum XOR of Two Numbers in an Array 陣列中值最大的兩個數字

Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. Could you

(偽題解)洛谷P5283:[十二省聯考2019]粽子——題解(代碼等有學補)

.org 數量 博客 list cal mat lin math -h https://www.luogu.org/problemnew/show/P3732 小粽是一個喜歡吃粽子的好孩子。今天她在家裏自己做起了粽子。 小粽面前有 n 種互不相同的粽子餡兒,小粽將它

對文件xor)解密的方法

log 題目 txt文件 比較 ubi 二進制 python print Coding 這裏對異或做下簡單的解釋,異或是一種2進制的運算,這裏舉個簡單的例子 1^1=0 1^0=1 兩者相同則為0,不同則為1 a的二進制是01100001 b的二進制是01100010 逐位

leetcode算法題1: 兩個二進制數有多少位不相同?、位移、與運算的主場

output 判斷 ++ 輸入 urn ger ria 結果 ret /* The Hamming distance between two integers is the number of positions at which the corresponding bit

1到n,n個整數連續的值(1 xor 2 xor 3 ... .. xor n)

。。 nbsp 異或 == ... n) 暴力 bsp 連續 暴力推,前12個數如下: 1 3 0 4 1 7 0 8 1 11 0 12 。。。。 所以對於任意的 n 有如下結論: if : n % 4 == 1 ans

POJ 3764 The xor-longest Path ( 字典樹求異最值 && 自反性質 && 好題好思想)

strong span -s node poj printf return blog pre 題意 : 給出一顆無向邊構成是樹,每一條邊都有一個邊權,叫你選出一條路,使得此路所有的邊的異或值最大。 分析 : 暴力是不可能暴力的,這輩子不可能暴力,那麽來冷靜分析一下如何去

2017 ACM-ICPC Asia Xi'an Problem A XOR線性基 )

problem 線段樹 all gpo efi printf 異或 bre %d 題目鏈接 2017西安賽區 Problem A 題意 給定一個數列,和$q$個詢問,每個詢問中我們可以在區間$[L, R]$中選出一些數。    假設我們選出來的這個數列為$A[i_{

深入理解按位運算符

alt 位運算 table ble 不同 按位與 pos http byte 異或運算: 首先異或表示當兩個數的二進制表示,進行異或運算時,當前位的兩個二進制表示不同則為1相同則為0.該方法被廣泛推廣用來統計一個數的1的位數! 參與運算的兩個值,如果兩個相應bit位相同,則

關於shell編程中邏輯運算理解和實驗

運維 shell 邏輯運算 shell編程中的邏輯運算,有或且非、短路運算,異或運算,我們用最簡單的方式理解一下異或。 異或:^ 異或的兩個值,相同為假,不同為真 理解起來,兩個值是指二進制的值,出現兩個1或者兩個0結果為假[0],出現兩個不一樣的值結果為[1]。 例如: 十進制 二進制

CodeForces - 617E XOR and Favorite Number (莫隊+前綴和)

cti 暴力 連續 air codeforce oid 前綴 truct iostream 題意:給你一個長為n的序列,在給你一個m次詢問,每次詢問區間內能有多少個連續子序列的異或和為k 題解:還是莫隊啊,暴力搞事情啊。假設a^b=k, 那麽我們每次莫隊add的時候只要an

牛客挑戰賽18 C和 (加深下對哈曼頓距離的理解)

coder scanf fin board 貢獻 brush true mat TE 鏈接:https://www.nowcoder.com/acm/contest/129/C來源:牛客網 異或和 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C+

bzoj2115 [Wc2011] Xor——高斯消元 & 線性基

++ r+ n) 沒有 get TP pro bzoj () 題目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 異或兩次同一段路徑的權值,就相當於沒有走這段路徑; 由此可以得到啟發,對於不同的走法,也許只需要找

Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 【莫隊算法 + 和前綴和的巧妙】

lag ans integer ons lap stand 推出 open closed 任意門:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit p

leetcode【165】Single Number(關於

寫在最前面:除了介紹這道題本身以外,會講一講python中的異或 leetcode【165】Single Number Your algorithm should have a linear runtime complexity. Could you implement it witho