程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位运算。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制110,11的二进制是1011,那么6 and 11的结果就是2(0010),它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理,同1为1,其余全为0)。位运算相较于其他计算符来讲,由于是直接使用计算机的方式来处理数据,无疑会被计算机更快的识别处理,提高程序运行速度。
1
|
~
|
2
|
<<、>>
|
3
|
&
|
4
|
^
|
5
|
|
|
6
|
&=、^=、|=、<<=、>>=
|
下面举一些位运算的小例子:
1.&的妙用
if((n&1) == 1)
{
System.out.println("n为奇数");
}
n&1是n和1做"按位与"运算,1的二进制只有末位是1,所以n&1就是只保留n的末位(二进制).n&1就表示了n的奇偶性.n若为偶数,其二进制表示最后一位一定为0,所以与1相与得0,而奇数则相反,其二进制最后一位一定为1,所以与1相与得1,这样就可以判断一个数的奇偶性,而不是使用%2的方法来判断。
2.<< 和 >>的秒用
public class exercise{
public static void main(String[] args) {
int i=4;
int j=6;
System.out.println(i<<1);
System.out.println(j>>1);
}
}
向左移相当于一个数乘2,向右移相当于除2,例如上面的4(省略到只有四位0100),向左移一位,就变成了8(1000),而6(0110),向右移一位则变为了3(0011)。
3^(异或)的妙用
public class exercise3 {
public static void main(String[] args) {
int i=-4;
int j=6;
boolean isNeg = (i^j)>>>31 == 0;
if(isNeg)
{
System.out.println("i,j同号");
}
else
{
System.out.println("i,j异号");
}
}
}
异或的规则是同0异1,通常和>>>(无符号右移)搭配使用,>>表示有符号右移,如果该数为正,则高位补0,若为负数,则高位补1;>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。int类型32位,无符号右移31位则只剩下符号位,进行异或便可知道两数是不是同号。而且这样写最大的好处是不需要考虑数值越界的问题。
大概比较常用的有这几个,以后再进行补充。