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 位时,数字被解释为负值。

相关文章
相关标签/搜索