按位運算符允許我們操作一個整數主數據類型中的單個“比特”,即二進制位。按位運算符會對兩個自變量中對應的位執行布爾代數,並最終生成一個結果。
按位運算來源於C語言的低級操作。我們經常都要直接操縱硬件,需要頻繁設置硬件寄存器內的二進制位。Java的設計初衷是嵌入電視頂置盒內,所以這種低級操作仍被保留下來了。然而,由於操作系統的進步,現在也許不必過於頻繁地進行按位運算。
若兩個輸入位都是1,則按位AND運算符(&)在輸出位裡生成一個1;否則生成0。若兩個輸入位裡至少有一個是1,則按位OR運算符(|)在輸出位裡生成一個1;只有在兩個輸入位都是0的情況下,它才會生成一個0。若兩個輸入位的某一個是1,但不全都是1,那麼按位XOR(^,異或)在輸出位裡生成一個1。按位NOT(~,也叫作“非”運算符)屬於一元運算符;它只對一個自變量進行操作(其他所有運算符都是二元運算符)。按位NOT生成與輸入位的相反的值——若輸入0,則輸出1;輸入1,則輸出0。
按位運算符和邏輯運算符都使用了同樣的字符,只是數量不同。因此,我們能方便地記憶各自的含義:由於“位”是非常“小”的,所以按位運算符僅使用了一個字符。
按位運算符可與等號(=)聯合使用,以便合並運算及賦值:&=,|=和^=都是合法的(由於~是一元運算符,所以不可與=聯合使用)。
我們將boolean(布爾)類型當作一種“單位”或“單比特”值對待,所以它多少有些獨特的地方。我們可執行按位AND,OR和XOR,但不能執行按位NOT(大概是為了避免與邏輯NOT混淆)。對於布爾值,按位運算符具有與邏輯運算符相同的效果,只是它們不會中途“短路”。此外,針對布爾值進行的按位運算為我們新增了一個XOR邏輯運算符,它並未包括在“邏輯”運算符的列表中。在移位表達式中,我們被禁止使用布爾運算,原因將在下面解釋。