異或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。所以兩數交換的解釋應該可以同理。
例子:
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)
總結
- 異或代表的是兩個變數之間的求差異的過程。
- 異或的性質用的最多的還是異或自己得到0, 0異或自己還是自己,這個性質。
- 格雷碼是異或的一種應用,滿足了數序列的變換穩定性。
參考文獻
相關推薦
異或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