在本例中,变量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 位时,数字被解释为负值。