位運算

一:與運算符(&)

預算規(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ù)進行異或運算,就能得到原始的文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容