祕密

祕密

學習練習

簡介

位元操作

Java 提供了運算子,可以操作byte、short、int、long或char的位元。

移位運算子

使用<<將位元向左移位,使用>>向右移位。

// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100

// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010

<<運算子一律在右側插入 0。不過,>>會插入與最左邊位元相同的位元(若為負數則為 1,若為正數則為 0)。

// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;

// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001

向右移位時若想插入 0,請改用>>>。

// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001

位元運算

位元 AND

位元 AND(&)運算子接受兩個值,並對每個位元執行 AND。它會比較第一個值的每個位元,以及第二個值中相同位置的位元。如果兩者都是 1,結果的位元就是 1。否則,結果的位元就是 0。

0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
位元 OR

位元 OR(|)運算子接受兩個值,並對每個位元執行 OR。它會比較第一個值的每個位元,以及第二個值中相同位置的位元。如果其中任一個位元是 1,結果的位元就是 1。否則就是 0。

0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
位元 XOR

位元 XOR 運算子(^)會對兩個值執行位元 XOR。和位元 AND、位元 OR 運算子一樣,它會比較第一個值的每個位元,以及第二個值中相同位置的位元。如果只有其中一個是 1,結果的位元就是 1。否則就是 0。

0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
位元 NOT(~)

最後,位元 NOT 運算子(~)會翻轉每個位元。和先前的運算子不同,這是一元運算子,只作用於一個值。

~0b0110_0101;
// # => 0b1001_1010

說明

你的朋友剛傳了一則帶有重要秘密的訊息給你。 為了不讓其他人輕易讀取,這則訊息在加密時經過一連串的位元操作。 你需要撰寫方法來協助解密這則訊息。

1. 把位元移回去

解密訊息的第一步,是把位元往右移回去,以還原加密過程中的位移。 解密程序後續的步驟會假設左側會補入 0。

實作 Secrets.shiftBack 方法,它接受一個值和要位移的位數,並執行位移。

Secrets.shiftBack(0b1001, 2);
# => 0b0010

2. 設定一些位元

接下來,有些位元需要設為 1。

實作 Secrets.setBits 方法,它接受一個值和一個遮罩,並回傳把值中對應位元設為 1 的結果。 當遮罩中的位元是 1 時,值中對應的位元也應設為 1。 其他所有位元則保持不變。

Secrets.setBits(0b0110, 0b0101);
# => 0b0111

3. 翻轉特定的位元

加密過程中有些位元會被翻轉。 解密時需要把它們翻轉回來。

實作 Secrets.flipBits 方法,它接受一個值和一個遮罩。 遮罩指出值中哪些位元要翻轉。 如果遮罩中的位元是 1,值中對應的位元就會被翻轉。 其他所有位元則保持不變。

Secrets.flipBits(0b1100, 0b0101);
# => 0b1001

4. 清除特定的位元

最後,還有某些位元解密後永遠是 0。

實作 Secrets.clearBits 方法,它接受一個值和一個遮罩。 當遮罩中的位元是 1 時,value 中對應的位元應設為 0。 其他所有位元則保持不變。

Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Java Exercism

準備好開始 祕密 了嗎?

註冊 Exercism,透過 26 個概念158 個練習 和真人引導來學習並精通 Java,全部免費。