-
1 # 大鼻子熊哥的VLOG
-
2 # 氚思琶醍
異或是二進位制運算子,用xor表示,若兩個二進位制位相同,則結果為0,不同為1。例若a=110,b=010,則c=a xor b=100.
-
3 # Qi朱哥說
與,或,非,同或,異或..最基本的邏輯。
異或,英文為exclusive OR,縮寫成xor異或(xor)是一個數學運算子。它應用於邏輯運算。異或的數學符號為“⊕”,計算機符號為“xor”。
參與運算的兩個值,如果兩個相應bit位相同,則結果為0,否則為1。
即:
0^0 = 0,
1^0 = 1,
0^1 = 1,
1^1 = 0
按位異或的3個特點:
(1) 0^0=0,0^1=1 0異或任何數=任何數
(2) 1^0=1,1^1=0 1異或任何數-任何數取反
(3) 任何數異或自己=把自己置0
按位異或的幾個常見用途:
(1) 使某些特定的位翻轉
(2) 實現兩個值的交換,而不必使用臨時變數。
(3) 在組合語言中經常用於將變數置零:
(4) 快速判斷兩個值是否相等
5 應用通式
就是加密啊解密啊
-
4 # 淘麥麥電商部落
看了你的問題,我覺得我應該能幫助到你,所以我整理了以下這些邏輯告訴你異或有什麼用,希望可以幫助到您。舉個簡單的例子的話,它可以用來交換兩個變數的值。當然它的應用也很廣泛,不只是這樣子簡單的用法。下面我具體說一下從其他的角度異或(xor)有什麼作用。
首先,({true,false}, xor)同構於({0,1},+),其實就是模二加群( )的加法:(看圖一)
其次,異或其實就是邏輯中不等號(!=,<>;)的表達形式。
最後,因為異或的特性(交換律、結合律),產生了一個有趣的事情:
A xor B = C
A xor B xor B = C xor B = A
也就說
A xor B = C
C xor B = A
對應了對合變換。
於是異或其實有些亂七八糟的小應用,比如:
1、交換兩個數:
procedure swap(var a,b:integer);
begin
a := a xor b;
b := a xor b;
a := a xor b;
end;
2、讀入1..n中的n-1個數,輸出少掉的那個:
program ex(input,output);
var n,x,i,ans,real_ans:integer;
begin
readln(n);
ans := n;
real_ans := 0;
for i := 1 to n-1 do
begin
read(x);
ans := ans xor i;
real_ans := real_ans xor x;
end;
writeln(ans xor real_ans);
end.
3、一串數字,除了某個數x外每個數都出現偶數次,但是x只出現了奇數次,找出x:
program ex(input,output);
var x,ans:integer;
begin
ans := 0;
while not(eoln()) do
begin
read(x);
ans := ans xor x;
end;
writeln(ans);
end.
【異或】是一個重要的邏輯運算,
公式為:a^b=(a&~b)|(~a&b)
具體到位運算,相同位異或得0,不同位異或得1。異或有幾個重要的運算規律,對某些特殊的運算有奇效。
歸零律:a^a = 0
交換律:a^b=b^a
結合律:a^b^c=(a^b)^c=(a^b)^c
由a^b=(a&~b)|(~a&b)公式,還可得到,
當b=全1時,a^b=(a&全0)|(~a&全1)=~a,此時【異或】相當於對a取反。
當b=全0時,a^b=(a&全1)|(~a&全0)=a,此時【異或】結果就等於a。
由歸零律,可以用異或交的兩個不同位置的變數x,y:
y=x^y,此時y=x^y,x值不變;
x=y^x,此時x=(x^y)^x=y,y=x^y;
y=y^x,此時y=(x^y)^y=x,x=y,交換完畢;
其實計算機只能識別0和1,然後就是我們程式設計所涉及到的運算,如加減乘除等,在計算機底層都是轉換成二進位制來進行運算的。所以很有必要學習一下計算機的位運算。並且,我在配圖裡給您分享了常見的常見位運算的經典問題,其實位運算的應用遠遠不止這些,在演算法方面適當的使用還是很有幫助的。
回覆列表
大家好我是創業熊哥,我來回答異或作用之前先來了解一下什麼叫異或:異或英文為exclusive OR,或縮寫成xor,異或(xor)是一個數學運算子。它應用於邏輯運算。異或的數學符為“⊕”,計算機符號為“xor”。其運演算法則為:a⊕b = (¬a ∧ b) ∨ (a ∧¬b)如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。
1.異或的作用如下:
在計算機中普遍運用,異或(xor)的邏輯符號一般用xor,也有用⊕的:
真⊕假=真
假⊕真=真
假⊕假=假
真⊕真=假
或者為:
True ⊕ False = True
False ⊕ True = True
False ⊕ False = False
True ⊕ True = False
2.起記憶體保護作用。比如Microsoft Visual Studio你加了如下開關/GS會自動加上如上類似的操作。我們可以認為是一種安全cookie比如如下:char buffer[5];strcpy(buffer, "0123456");會有問題。但是有了/GS這種功能後會自動加上如下的程式碼:mov eax, dword ptr ds:___sec_cookie ; 某個固定的值xor eax, ebp ; 調整指標mov [ebp+SOMETHING], eax ; 儲存處理過的結果這樣就不容易出現安全漏洞。比如在以前我們可以利用strcpy給程式碼注入一段可執行程式碼,現在就杜絕掉了。具體可以查詢visual studio的/GS開關。