结论:
- 计算机最终以补码形式存储数字,所以位运算符都是对补码进行运算的
- 我们用手算也可如此,把操作数全部转换成补码形式后,对补码进行运算,结果转为我们熟悉的形式
- &(按位与)、|(按位或)、~(按位非)、^(按位异或):对补码进行运算,符号位参与运算
- <<(左移运算符)
1.正或负值<<正值:补码左移,符号位参与左移,右边补零,每一次左移相当于乘于2,无限次运算后,结果的绝对值越来越大,最终都归0
2.正或负值<<负值:自行改代码探索
3.为零的情况:自行改代码探索
- >>(右移运算符)
1.正或负值>>正值:补码右移,符号位参与右移,左边补符号位,每一次右移相当于除于2
正值>>正值:无限次运算后,结果绝对值越来越小,最终归0
负值>>正值:无限次运算后,结果绝对值越来越小,最终归-1
2.正或负值>>负值:自行改代码探索
3.为零的情况:自行改代码探索
- >>>(无符号右移运算符)
>>>(无符号右移运算符)
1.正或负值>>>正值:补码右移,符号位参与右移,左边补零,所以结果一定为正数
正值>>>正值:和右移运算符规律一样
负值>>>正值:绝对值越小,无符号右移的结果越大,经过一次运算都会变成正值,之后规律和右移运算符规律一样
2.负值>>>负值:自行看规律
3.正值>>>负值:自行改代码看规律
为零的情况:自行改代码探索
运行以下代码,可得以上结论
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class BitOperation {
@Test
public void bitwiseAND() {
for (int i = 1; i <= 5; i++) {
int l = -9;
int r = i;
int x = l & r;
System.out.println(String.format("%-16s", "符号:") + "&");
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.println(String.format("%-16s", "右值(" + r + "):") + toBinaryString(r));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void bitwiseOR() {
for (int i = 1; i <= 5; i++) {
int l = -9;
int r = i;
int x = l | r;
System.out.println(String.format("%-16s", "符号:") + "|");
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.println(String.format("%-16s", "右值(" + r + "):") + toBinaryString(r));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void bitwiseNOTPlus() {
for (int i = 1; i <= 5; i++) {
int r = i;
int x = ~r;
System.out.println(String.format("%-16s", "符号:") + "~");
System.out.println(String.format("%-16s", "右值(" + r + "):") + toBinaryString(r));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void bitwiseNOTNegative() {
for (int i = 1; i <= 5; i++) {
int r = -i;
int x = ~r;
System.out.println(String.format("%-16s", "符号:") + "~");
System.out.println(String.format("%-16s", "右值(" + r + "):") + toBinaryString(r));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void bitwiseXORPlus() {
for (int i = 1; i <= 5; i++) {
int l = 9;
int r = i;
int x = l ^ r;
System.out.println(String.format("%-16s", "符号:") + "^");
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.println(String.format("%-16s", "右值(" + r + "):") + toBinaryString(r));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void bitwiseXORNegative() {
for (int i = 1; i <= 5; i++) {
int l = -9;
int r = i;
int x = l ^ r;
System.out.println(String.format("%-16s", "符号:") + "^");
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.println(String.format("%-16s", "右值(" + r + "):") + toBinaryString(r));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void shiftRightOperatorPlus() {
for (int i = 1; i <= 5; i++) {
int l = 9;
int r = i;
int x = l >> r;
System.out.println(String.format("%-16s", "符号:") + ">>");
System.out.println(String.format("%-16s", "右值(" + r + "):") + r);
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void shiftRightOperatorNegative() {
for (int i = 1; i <= 5; i++) {
int l = -9;
int r = i;
int x = l >> r;
System.out.println(String.format("%-16s", "符号:") + ">>");
System.out.println(String.format("%-16s", "右值(" + r + "):") + r);
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.println(String.format("%-16s", "结果(" + x + "):") + toBinaryString(x));
System.out.println();
}
}
@Test
public void shiftLeftOperatorPlus() {
for (int i = 1; i <= 5; i++) {
int l = 9;
int r = i;
int x = l << r;
System.out.println(String.format("%-16s", "符号:") + "<<");
System.out.println(String.format("%-16s", "右值(" + r + "):") + r);
System.out.println(String.format("%-16s", "左值(" + l + "):") + toBinaryString(l));
System.out.p