由于位运算是二进制运算,不要与一些八进制数搞混,java中二进制数没有具体的表示方法。
public class BitMath{
public static void main(String[] args){
System.out.println("010|4="+(010|4));
}
}
输出结果:
010|4=12
计算过程:
0000 0000 0000 0000 0000 0000 0000 1000?8
0000 0000 0000 0000 0000 0000 0000 0100?4
进行“或”计算结果为:
0000 0000 0000 0000 0000 0000 0000 1100?12
当位运算中遇见负数,必须把它转成补码(不知道什么是补码的补习功课去)再进行计算,而不是使用原码。
程序:
public class BitMath{
public static void main(String[] args){
try {
int x = -7;
System.out.println("x>>1="+(x>>1));
} catch(Exception e) {
System.out.println("Exception");
}
}
}
输出结果:
x>>1=-4
计算过程:
1111 1111 1111 1111 1111 1111 1111 1001?-7
1111 1111 1111 1111 1111 1111 1111 1100?-4
public class BitMath{
public static void main(String[] args){
int i = 1;
int j = -1;
System.out.println("1>>>31="+(i>>>31));
System.out.println("-1>>31="+(j>>31));
}
}
输出结果:
1>>>31=0
-1>>31=-1
程序:
public class BitMath{
public static void main(String[] args){
int a = 1;
a <<= 31;
a >>= 31;
a >>= 1;
System.out.println("a="+a);
int b = 1;
b <<= 31;
b >>= 31;
System.out.println("b="+b);
int c = 1;
c >>= 31;
c <<= 31;
System.out.println("c="+c);
}
}
输出结果:
a=-1
b=-1
c=0
计算过程:
0000 0000 0000 0000 0000 0000 0000 0001?a=1
1000 0000 0000 0000 0000 0000 0000 0000?a=a<<31后,这里被当作是负数
1111 1111 1111 1111 1111 1111 1111 1111?a=a>>31后,结果为-1
1111 1111 1111 1111 1111 1111 1111 1111?a=a>>1后,结果仍为-1
0000 0000 0000 0000 0000 0000 0000 0001?c=1
0000 0000 0000 0000 0000 0000 0000 0000?c=c>>31后为0
0000 0000 0000 0000 0000 0000 0000 0000?0左移31位仍为0