在本例中,變量a與b對應位的組合表明了二進制數全部的 4 種組合模式:0-0,0-1,1-0 ,和1-1 。「|」運算符和「&」運算符分別對變量a與b各個對應位的運算獲得了變量c和變量d的值。對變量e和f的賦值說明了「^」運算符的功能。字符串數組binary 表明了0到15 對應的二進制的值。在本例中,數組各元素的排列順序顯示了變量對應值的二進制代碼。數組之因此這樣構造是由於變量的值n對應的二進制代碼能夠被正確的存儲在數組對應元素binary[n] 中。例如變量a的值爲3,則它的二進制代碼對應地存儲在數組元素binary[3] 中。~a的值與數字0x0f (對應二進制爲0000 1111 )進行按位與運算的目的是減少~a的值,保證變量g的結果小於16。所以該程序的運行結果能夠用數組binary 對應的元素來表示。該程序的輸出以下:程序員
|
3、左移運算符ui
左移運算符<<使指定值的全部位都左移規定的次數。它的通用格式以下所示:spa
|
這裏,num 指定要移位值value 移動的位數。也就是,左移運算符<<使指定值的全部位都左移num位。每左移一個位,高階位都被移出(而且丟棄),並用0填充右邊。這意味着當左移的運算數是int 類型時,每移動1位它的第31位就要被移出而且丟棄;當左移的運算數是long 類型時,每移動1位它的第63位就要被移出而且丟棄。ip
在對byte 和short類型的值進行移位運算時,你必須當心。由於你知道Java 在對錶達式求值時,將自動把這些類型擴大爲 int 型,並且,表達式的值也是int 型。對byte 和short類型的值進行移位運算的結果是int 型,並且若是左移不超過31位,原來對應各位的值也不會丟棄。可是,若是你對一個負的byte 或者short類型的值進行移位運算,它被擴大爲int 型後,它的符號也被擴展。這樣,整數值結果的高位就會被1填充。所以,爲了獲得正確的結果,你就要捨棄獲得結果的高位。這樣作的最簡單辦法是將結果轉換爲byte 型。下面的程序說明了這一點:ci
|
該程序產生的輸出下所示:class
|
因變量a在賦值表達式中,故被擴大爲int 型,64(0100 0000 )被左移兩次生成值256 (10000 0000 )被賦給變量i。然而,通過左移後,變量b中唯一的1被移出,低位所有成了0,所以b的值也變成了0。
既然每次左移均可以使原來的操做數翻倍,程序員們常常使用這個辦法來進行快速的2 的乘法。可是你要當心,若是你將1移進高階位(31或63位),那麼該值將變爲負值。下面的程序說明了這一點:
|
這裏,num 指定要移位值value 移動的位數。也就是,左移運算符<<使指定值的全部位都左移num位。每左移一個位,高階位都被移出(而且丟棄),並用0填充右邊。這意味着當左移的運算數是int 類型時,每移動1位它的第31位就要被移出而且丟棄;當左移的運算數是long 類型時,每移動1位它的第63位就要被移出而且丟棄。
在對byte 和short類型的值進行移位運算時,你必須當心。由於你知道Java 在對錶達式求值時,將自動把這些類型擴大爲 int 型,並且,表達式的值也是int 型。對byte 和short類型的值進行移位運算的結果是int 型,並且若是左移不超過31位,原來對應各位的值也不會丟棄。可是,若是你對一個負的byte 或者short類型的值進行移位運算,它被擴大爲int 型後,它的符號也被擴展。這樣,整數值結果的高位就會被1填充。所以,爲了獲得正確的結果,你就要捨棄獲得結果的高位。這樣作的最簡單辦法是將結果轉換爲byte 型。下面的程序說明了這一點:
|
該程序產生的輸出下所示:
|
因變量a在賦值表達式中,故被擴大爲int 型,64(0100 0000 )被左移兩次生成值256 (10000 0000 )被賦給變量i。然而,通過左移後,變量b中唯一的1被移出,低位所有成了0,所以b的值也變成了0。
既然每次左移均可以使原來的操做數翻倍,程序員們常常使用這個辦法來進行快速的2 的乘法。可是你要當心,若是你將1移進高階位(31或63位),那麼該值將變爲負值。下面的程序說明了這一點:
|
該程序的輸出以下所示:
|
初值通過仔細選擇,以便在左移 4 位後,它會產生-32。正如你看到的,當1被移進31 位時,數字被解釋爲負值。