对于整数有一种重要的位运算操作。注意:浮点数不适用于位运算。位运算符最适用于对整型数值进行运算。
位运算符运算时,先要将一个整型数值转换为以二进制表示的整型数值再按位进行计算。位运算符可分为二种类型:位逻辑运算符(有4个)和移位运算符(有3个),详见下表说明:
一个比特位只有二种可能的取值:0或1。
位逻辑运算是对比特位的运算,其运算规则如下图,其中x和y分别表示比特位变量,其值是0或1。例如比特位x=0,则按位取反~x=1;如x=1,y=0,则按位异或x^y = 1^0 = 1;如x=1,y=0,则按位与x&y=1&0=0,以此类推。
位逻辑运算,先要将一个整型数值转换成以二进制表示的整型数值,然后再按位进行计算。下面是109&11和109^11两个位逻辑运算的示例:
Java语言提供了3个移位运算符: <<(左移运算符)、>>(右移运算符)和>>>(无符号右移运算符)。
-
左移运算符"<<"
用来将一个整数的二进制位序列左移若干位。移出的高位丢弃,右边添0。 -
右移运算符">>"
用来将一个整数的二进制位序列右移若干位。移出的低位丢弃。若为正数,左边高位补0;若为负数,左边高位补1。 -
无符号右移运算符">>>"
也是将一个整数的二进制位序列右移若干位。它与右移运算符">>"的区别是,不论正数还是负数左边一律补0。整数的移位与乘除操作的关系:
整数移位运算时,如果没有发生有效位的数字丢失,左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方。
例如,整数11的二进制序列为:
00000000 00000000 00000000 00001011
若执行11<<3,结果为:
0000000 00000000 00000000 001011000
11左移3位,相当于11乘8(2的3次方),最后结果是88
下面给出一个整数的移位与乘除操作的例程:
public class 移位与乘除操作 {
public static void main(String[] args) {
int NUM = 2679;
int Nb = 0B1000; //整数8的二进制表示
int n1,n2;
n1 = NUM << 3; //左移3位。
n2 = NUM * Nb; //相当于乘以2的3次方
System.out.println("n1 = " + n1);
System.out.println("NUM左移3位与乘以2的3次方比较:" + (n1==n2));
int n21,n22;
n21 = NUM >> 3; //右移3位。
n22 = NUM / Nb; //相当于除以2的3次方
System.out.println("n21 = " + n21);
System.out.println("NUM右移3位与除以2的3次方比较:" + (n21==n22));
}
}