要想處理位元,你必須先得知道在二進制補碼([**two’s complement**](http://en.wikipedia.org/wiki/Two%27s_complement))標記內部,數字是如何表示的——二進制補碼和無格式二進制標記是一樣的,只是負數要“進行位元翻轉之后再加1”。比如要想得到數字-1,你要從用8位二進制整數表示是00000001的1開始。對每一個位元進行翻轉之后的結果是11111110,再加上1就是11111111,也就成了二進制補碼中的-1。
**左移位**運算符“<<”會把位元移向左邊,用0來補上移走之后的空位。
**右移位**運算符“>>”會把一個位模式向右移,但當向右移動負數時,它的作用在不同編程語言中也不一樣,在Java中,右移位會用符號擴充的辦法,用1來填充負數中的空位。
**邏輯右移位**運算符“>>>”是Java和Javascript中獨有的,無論數值是多少,它都用0來填充空位。
**設置某一位**:可以用**按位或**運算符(|)。
~~~
num |= 1 << x; //這行代碼將會設置位元x
~~~
**清除某一位**:可以用**按位與**運算符(&),并且用**取反**運算符(~)來屏蔽所有你不想清除的位元。
~~~
num &= ~(1 << x); //這會清除位元x
~~~
**清除一直到****i****的所有有效位元**:
~~~
num &= (1 << (i + 1)) -1;
~~~
切換某一位元:可以用**按位異或**運算符(^)
~~~
num ^= 1 << x; //這會切換位元x
~~~
獲得一個位元:對你想檢查的位元用**按位與**
~~~
bit = num & (1 << x);
~~~
### 設計模式/面向對象編程
和面向對象編程相關的問題,一般會涉及到設計相關類里的集,以便檢驗你對面向對象編程的熟悉程度,并了解你是如何架構代碼的。你可以使用界面和/或抽象的類來說明,并記住用單例模式([**Singleton**](http://en.wikipedia.org/wiki/Singleton_pattern))、工廠方法模式([**Factory**](http://en.wikipedia.org/wiki/Factory_method_pattern))和策略模式([**Strategy**](http://en.wikipedia.org/wiki/Strategy_pattern))來解決這類問題,在編寫優雅而可維護的代碼方面,它們能對你有長久的助益。