本篇的主要目的想要把java位运算的相关知识进行一个总结,主要包括表示方式、位运算时移位的方式
一、表示方式
首先学过计算机的我们都应该知道计算机采用补码的方式对数据进行表示,同时java的所有数据类型都是有符号的数据表示形式。即利用最高位作为符号位,正数时为0,负数时为1。我用了下面的这种方式验证。
public static void comfirm() {
int cnt = 1;
//a的反码:0000 0000 0000 0000 0000 0000 0000 0010
int a = 2;
//b的反码:1111 1111 1111 1111 1111 1111 1111 1110
int b = -2;
for (int i = 1; i <= 32; i++) {
System.out.println("a" + i + "=" + (a & cnt) / cnt);
cnt *= 2;
System.out.println("cnt=" + cnt);
}
cnt=1;
for (int i = 1; i <= 32; i++) {
System.out.println("b" + i + "=" + (b & cnt) / cnt);
cnt *= 2;
System.out.println("cnt=" + cnt);
}
}
由打印结果知道其与其补码表示的结果一致
二、>>、<<移位运算是逻辑移位还是算术移位
逻辑移位(不管是左移位还是右移位) 都是空缺处补0
算术移位要保证符号位的不改变,对于负数的补码,左移添0、右移添1,正数补码则是都是添0
public static void comfirm() {
int cnt = 1;
//a的反码:0000 0000 0000 0000 0000 0000 0000 0010
int a = 2;
//b的反码:1111 1111 1111 1111 1111 1111 1111 1110
int b = -2;
a=a>>2;
for (int i = 1; i <= 32; i++) {
System.out.println("a" + i + "=" + (a & cnt) / cnt);
cnt *= 2;
System.out.println("cnt=" + cnt);
}
System.out.println("-----------------------------");
a=2<<2;
cnt=1;
for (int i = 1; i <= 32; i++) {
System.out.println("a" + i + "=" + (a & cnt) / cnt);
cnt *= 2;
System.out.println("cnt=" + cnt);
}
System.out.println("-----------------------------");
cnt=1;
b=b>>3;
for (int i = 1; i <= 32; i++) {
System.out.println("b" + i + "=" + (b & cnt) / cnt);
cnt *= 2;
System.out.println("cnt=" + cnt);
}
System.out.println("b="+b);
System.out.println("-----------------------------");
cnt=1;
b=-2<<3;
for (int i = 1; i <= 32; i++) {
System.out.println("b" + i + "=" + (b & cnt) / cnt);
cnt *= 2;
System.out.println("cnt=" + cnt);
}
System.out.println("b="+b);
}
由上结果可见其是算术移位。不过这样的实验是多余的,因为逻辑移位针对的是无符号数,而算术移位针对的是有符号数