一:與運算符(&)
預算規(guī)則:
0&0=0;0&1=0;1&0=0;1&1=1
即:兩個同時為1,結果為1,否則為0
例如:3&5
十進制3轉為二進制的3:0000 0011
十進制5轉為二進制的5:0000 0101
------------------------結果:0000 0001 ->轉為十進制:1
即:3&5 = 1
二:或運算(|)
運算規(guī)則:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :參加運算的兩個對象,一個為1,其值為1。
例如:3|5 即 00000011 | 0000 0101 = 00000111,因此,3|5=7。
三:異或運算符(^)
運算規(guī)則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:參加運算的兩個對象,如果兩個位為“異”(值不同),則該位結果為1,否則為0。
例如:3^5 = 0000 0011 | 0000 0101 =0000 0110,因此,3^5 = 6
// 3.異或(相同為0,不同為1. 可以理解為不進位加法)
void swap(int a, int b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
異或運算是編程中常見的一種運算,用^或XOR表示,它的基本運算法則如下:
true XOR true = false;
true XOR false = true;
false XOR true = true;
false XOR false =false;
簡單總結就是異或運算的兩邊如果相同,那么結果就是false,如果異或運算的兩邊不同,那么結果就為true。
那么我們可以根據(jù)異或運算的性質,來對數(shù)據(jù)進行簡單的加密。先舉個簡單的例子來看看原理。
假設我們需要運算這樣一個式子:6^3=?
我們先將6和3轉化為二進制,6轉化為二進制為110,3轉化為二進制為011。那么這個式子可以轉變?yōu)?10 ^ 011這樣的形式,從這個式子就能非常一目了然的看出來結果是為101,即轉化為十進制后結果等于5。那么6^3=5;
接下來我們對5和3再次進行異或運算,5^3等于多少呢?
轉化成二進制后的式子為101 ^ 011=110;這時候我們會發(fā)現(xiàn)一個非常有趣的現(xiàn)象,即5 ^ 3=6。我們先是用6 ^ 3了一次,然后再用6 ^ 3得到的結果再次^了3這個數(shù),發(fā)現(xiàn)最后的結果又變成6了。
其實這就是異或運算里面的一個定理:即一個數(shù)據(jù)異或另一個數(shù)據(jù)兩次,最后得到的結果還是這個數(shù)據(jù),用公式表示就是a ^ b ^ b=a。
我們知道,在計算機中,所有數(shù)據(jù)的存儲形式都是二進制的數(shù)據(jù)形式,無論圖片,視頻,音頻最終都是以二進制的數(shù)據(jù)形式存儲在盤符中,所以在了解異或運算的原理之后,我們可以使用異或運算對文件進行簡單的加密。如想對某張圖片進行加密,那么只需要將這一張圖片與一個復雜的數(shù)據(jù)進行異或運算后,就完成了加密的過程,加密者只需要將異或運算的數(shù)據(jù)記下來,作為解密的秘鑰,在解密的時候,用加密后的文件再次與該數(shù)據(jù)進行異或運算,就能得到原始的文件。