JAVA按位邏輯運算基本教程(2)

在本例中,變量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 對應的元素來表示。該程序的輸出以下:程序員

a = 0011 b = 0110 a|b = 0111 a&b = 0010 a^b = 0101 ~a&b|a&~b = 0101 ~a = 1100 數組

3、左移運算符ui

左移運算符<<使指定值的全部位都左移規定的次數。它的通用格式以下所示:spa

value << numcode

這裏,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

// Left shifting a byte value.
class ByteShift {字符串

public static void main(String args[]) {
byte a = 64, b;
int i; i = a << 2;
b = (byte) (a << 2); System.out.println("Original value of a: " + a);
System.out.println("i and b: " + i + " " + b);
}
}table

該程序產生的輸出下所示:class

Original value of a: 64
i and b: 256 0

因變量a在賦值表達式中,故被擴大爲int 型,64(0100 0000 )被左移兩次生成值256 (10000 0000 )被賦給變量i。然而,通過左移後,變量b中唯一的1被移出,低位所有成了0,所以b的值也變成了0。

既然每次左移均可以使原來的操做數翻倍,程序員們常常使用這個辦法來進行快速的2 的乘法。可是你要當心,若是你將1移進高階位(31或63位),那麼該值將變爲負值。下面的程序說明了這一點:

// Left shifting as a quick way to multiply by 2.
class MultByTwo {

public static void main(String args[]) {
int i;
int num = 0xFFFFFFE; for(i=0; i<4; i++) {
num = num << 1;
System.out.println(num);}
}

這裏,num 指定要移位值value 移動的位數。也就是,左移運算符<<使指定值的全部位都左移num位。每左移一個位,高階位都被移出(而且丟棄),並用0填充右邊。這意味着當左移的運算數是int 類型時,每移動1位它的第31位就要被移出而且丟棄;當左移的運算數是long 類型時,每移動1位它的第63位就要被移出而且丟棄。

在對byte 和short類型的值進行移位運算時,你必須當心。由於你知道Java 在對錶達式求值時,將自動把這些類型擴大爲 int 型,並且,表達式的值也是int 型。對byte 和short類型的值進行移位運算的結果是int 型,並且若是左移不超過31位,原來對應各位的值也不會丟棄。可是,若是你對一個負的byte 或者short類型的值進行移位運算,它被擴大爲int 型後,它的符號也被擴展。這樣,整數值結果的高位就會被1填充。所以,爲了獲得正確的結果,你就要捨棄獲得結果的高位。這樣作的最簡單辦法是將結果轉換爲byte 型。下面的程序說明了這一點:

// Left shifting a byte value.
class ByteShift {public static void main(String args[]) {
byte a = 64, b;
int i; i = a << 2;
b = (byte) (a << 2); System.out.println("Original value of a: " + a);
System.out.println("i and b: " + i + " " + b);
}
}

該程序產生的輸出下所示:

Original value of a: 64
i and b: 256 0

因變量a在賦值表達式中,故被擴大爲int 型,64(0100 0000 )被左移兩次生成值256 (10000 0000 )被賦給變量i。然而,通過左移後,變量b中唯一的1被移出,低位所有成了0,所以b的值也變成了0。

既然每次左移均可以使原來的操做數翻倍,程序員們常常使用這個辦法來進行快速的2 的乘法。可是你要當心,若是你將1移進高階位(31或63位),那麼該值將變爲負值。下面的程序說明了這一點:

// Left shifting as a quick way to multiply by 2.
class MultByTwo {

public static void main(String args[]) {
int i;
int num = 0xFFFFFFE;


for(i=0; i<4; i++) {
num = num << 1;
System.out.println(num);


}
}
}

該程序的輸出以下所示:

536870908
1073741816
2147483632
-32

初值通過仔細選擇,以便在左移 4 位後,它會產生-32。正如你看到的,當1被移進31 位時,數字被解釋爲負值。

相關文章
相關標籤/搜索