文档介绍:移位运算java的移位运算byzjq一基本概念所有的整数类型以二进制数字位的变化及其宽度来表示。例如,byte型值42的二进制代码是00101010,其中每个位置在此代表2的次方,在最右边的位以20开始。向左下一个位置将是21,或2,依次向左是22,或4,然后是8,16,32等等,依此类推。因此42在其位置1,3,5的值为1(从右边以0开始数);这样42是21+23+25的和,也即是2+8+32。所有的整数类型(除了char类型之外)都是有符号的整数。这意味着他们既能表示正数,又能表示负数。Java使用大家知道的2的补码(two'scomplement)这种编码来表示负数,也就是通过将与其对应的正数的二进制代码取反(即将1变成0,将0变成1),然后对其结果加1。例如,-42就是通过将42的二进制代码的各个位取反,即对00101010取反得到11010101,然后再加1,得到11010110,即-42。要对一个负数解码,首先对其所有的位取反,然后加1。例如-42,或11010110取反后为00101001,或41,然后加1,这样就得到了42。如果考虑到零的交叉(zerocrossing)问题,你就容易理解Java(以及其他绝大多数语言)这样用2的补码的原因。假定byte类型的值零用00000000代表。它的补码是仅仅将它的每一位取反,即生成11111111,它代表负零。但问题是负零在整数数学中是无效的。为了解决负零的问题,在使用2的补码代表负数的值时,对其值加1。即负零11111111加1后为100000000。但这样使1位太靠左而不适合返回到byte类型的值,因此人们规定,-0和0的表示方法一样,-1的解码为11111111。尽管我们在这个例子使用了byte类型的值,但同样的基本的原则也适用于所有Java的整数类型。因为Java使用2的补码来存储负数,并且因为Java中的所有整数都是有符号的,这样应用位运算符可以容易地达到意想不到的结果。例如,不管你如何打算,Java用高位来代表负数。为避免这个讨厌的意外,请记住不管高位的顺序如何,它决定一个整数的符号。二位逻辑运算符位逻辑运算符有“与”(AND)、“或”(OR)、“异或(XOR)”、“非(NOT)”,分别用“&”、“|”、“^”、“~”表示,4-3表显示了每个位逻辑运算的结果。在继续讨论之前,请记住位运算符应用于每个运算数内的每个单独的位。表4-3位逻辑运算符的结果A0101B0011A|B0111A&B0001A^B0110~A1010按位非(NOT)按位非也叫做补,一元运算符NOT“~”是对其运算数的每一位取反。例如,数字42,它的二进制代码为:00101010经过按位非运算成为11010101按位与(AND)按位与运算符“&”,如果两个运算数都是1,则结果为1。其他情况下,结果均为零。看下面的例子:0010101042&00001111150000101010按位或(OR)按位或运算符“|”,任何一个运算数为1,则结果为1。如下面的例子所示:0010101042|00001111150010111147按位异或(XOR)按位异或运算符“^”,只有在两个比较的位不同时其结果是1。否则,结果是零。下面的例子显示了“^”运算符的效果。这个例子也表明了XOR运算符的一个有用的属性。注意第二个运算数有数字1的位,42对应二进制代码的对应位是如何被转换的。第二个运算数有数字0的位,第一个运算数对应位的数字不变。当对某些类型进行位运算时,你将会看到这个属性的用处。0010101042^00001111150010010137位逻辑运算符的应用下面的例子说明了位逻辑运算符://{publicstaticvoidmain(Stringargs[]){Stringbinary[]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};inta=3;//0+2+1or0011inbinaryintb=6;//4+2+0or0110inbinaryintc=a|b;intd=a&b;inte=a^b;intf=(~a&b)|(a&~b);intg=~a&0x0f;("a="+binary[a]);("b="+binary[b]);("a|b="+binary[c]);("a&b="