關於異或(XOR)的有趣應用

2021-07-15 17:48:10 字數 1557 閱讀 8013

異或是個非常有意思的東西,利用異或的性質我們可以做一些有意思的事情。

異或加密解密

下面是乙個非常簡單的加密解密函式

public static string encryption(string srcstring, char key) 

return new string(srcchars);

}

給出測試**:

string password = encryption("eascs", 't');

system.out.println("password = " + password);

string src = encryption(password, 't');

system.out.println("src = " + src);

然後列印的結果如下:

接著大家可能會發現乙個問題,就是我們的password沒有資料,但是我們恢復源資料卻又是正確的,其實我們猜也可以猜的出來,肯定是生成了那些無法顯示的字元,為了驗證這個觀點,我們還是進行一下除錯,下面是除錯的結果截圖:

這裡就可以很清楚的說明了。

異或交換

估計這個功能用到的應該很少吧,其實這才是今天的重點,我們知道交換的方式有很多種,其中最常見的就是:

int a = 100;

int b = 200;

int c = a;

a = b;

b = c;

print("a = " + a + ", b = " + b);

列印結果:

交換成功了,這種方式是我們最常用的。

當然對於int型別的資料交換,我們還有一中方法,這種方法不會借用額外的變數:

a = a + b; // a = 300, b = 200

b = a - b; // a = 300, b = 100

a = a - b; // a = 200, b = 100

同樣的,我們也可以得到交換後的結果,不過這種方法是有侷限的,如果當a + b > integer.max_value時,這個地方是有問題的。

好了扯了這麼多,下面我們來介紹使用xor方式來進行交換:

a ^= b;     // a = a ^ b, b = b

b = a ^ b; // a = a ^ b, b = a

a = a ^ b; // a = b, b = a

看了**,其實這個有點類似上面我們介紹的加法交換,總結規律就是:

1. 讓某個值(a)等於這兩個值經過某種運算(#)後的結合值(a = a # b),此時有乙個值(b)是保持不變的。

2. 讓保持不變的值(b)通過結合值(a)與保持不變的值(b)經過某種運算(*)後,使b的值變成a的值。

3. 同理,由於b已經變成了a的值,那麼再經過運算(*)後,便可以使得a的值變為b的值。

寫這麼多其實還不如看**,慢慢理解來的直接,只不過一般文章都有個總結,那就加了個。

XOR 異或的性質與應用總結

下面的內容均來自於網路的收集和彙總。異或的實質是按位模2加,簡單理解就是不進製加法如 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 按位模2加 101 110 111 100 101 110111 322 2 100交換律 a b b a 結合律 a b c a b c a b c 恒...

有趣的異或

描述這是乙個有趣的題,給你n個數,聰明的大家都知道從中挑出k個數的方案數是多少?ps 當然不會考你這麼簡單的題 現在我們按照如下規則產生a k 1.從n個數中挑出k個數 2.將這k個數作異或運算 s a1 a2 ak 3.將每一種可能的方案產生的s求和 輸入 多組測試資料,以eof結束程式。每組測試...

加密101 異或(xor)

異或 xor 是邏輯運算子,符號是 當輸入同時為真或同時為假時,輸出為假。否則,輸出為真。xor可以叫做 可程式設計反向器 乙個輸入bit位決定要不要對另乙個輸入bit位取反。異或 xor 操作的圖示如上,在圖示左邊pi是明文文字 plaintext 的bit位,i是bit位的索引,因為我們要處理不...