原反补码
正数:原码,反码,补码都一样,三码合一
负数:反码为原码符号位不变,其他位取反,补码则是在反码基础上加1
1:左移:最左边丢弃,最右边补0,符号位相当于会一起移动,所以在某些数字的位移,会出现正数,负数的交替。位移如果超过或等于最大位数,实际位移数为:位移数%类型的位数(下面例子是int类型,位数为32)
正数左移
/**
* 左移正数
*/
@Test
public void leftShiftPositiveNumber() {
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00010100
System.out.println("10 << 1 = " + (10 << 1));
// 00000000 00000000 00000000 00001010 -> 01010000 00000000 00000000 00000000
System.out.println("10 << 27 = " + (10 << 27));
// 00000000 00000000 00000000 00001010 -> 10100000 00000000 00000000 00000000
// 10100000 00000000 00000000 00000000 -> 10011111 11111111 11111111 11111111 -> 11100000 00000000 00000000 00000000
System.out.println("10 << 28 = " + (10 << 28));
// 00000000 00000000 00000000 00001010 -> 01000000 00000000 00000000 00000000
System.out.println("10 << 29 = " + (10 << 29));
// 00000000 00000000 00000000 00001010 -> 10000000 00000000 00000000 00000000
System.out.println("10 << 30 = " + (10 << 30));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 << 31 = " + (10 << 31));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00001010
System.out.println("10 << 32 = " + (10 << 32));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00010100
System.out.println("10 << 33 = " + (10 << 33));
}
输出:
负数左移
/**
* 左移负数
*/
@Test
public void leftShiftNegativeNumber() {
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11101100 -> 11111111 11111111 11111111 11101011 -> 10000000 00000000 00000000 00010100
System.out.println("-10 << 1 = " + (-10 << 1));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 10110000 00000000 00000000 00000000 -> 10101111 11111111 11111111 11111111 -> 11010000 00000000 00000000 00000000
System.out.println("-10 << 27 = " + (-10 << 27));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 01100000 00000000 00000000 00000000
System.out.println("-10 << 28 = " + (-10 << 28));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11000000 00000000 00000000 00000000 -> 10111111 11111111 11111111 11111111 -> 11000000 00000000 00000000 00000000
System.out.println("-10 << 29 = " + (-10 << 29));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 10000000 00000000 00000000 00000000
System.out.println("-10 << 30 = " + (-10 << 30));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00000000 00000000 00000000 00000000
System.out.println("-10 << 31 = " + (-10 << 31));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11110110 -> 11111111 11111111 11111111 11110101 -> 10000000 00000000 00000000 00001010
System.out.println("-10 << 32 = " + (-10 << 32));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11101100 -> 11111111 11111111 11111111 11101011 -> 10000000 00000000 00000000 00010100
System.out.println("-10 << 33 = " + (-10 << 33));
}
输出:
2:右移
正数右移:符号位不动(动与不动,没有啥区别),最右边丢弃,最左边补0。位移如果超过或等于最大位数,实际位移数为:位移数%类型的位数(下面例子是int类型,位数为32)
/**
* 右移正数
*/
@Test
public void rightShiftPositiveNumber() {
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
System.out.println("10 >> 1 = " + (10 >> 1));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000010
System.out.println("10 >> 2 = " + (10 >> 2));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000001
System.out.println("10 >> 3 = " + (10 >> 3));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 >> 4 = " + (10 >> 4));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 >> 5 = " + (10 >> 5));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 >> 31 = " + (10 >> 31));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00001010
System.out.println("10 >> 32 = " + (10 >> 32));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
System.out.println("10 >> 33 = " + (10 >> 33));
}
输出:
负数右移:符号位不动(动与不动,没有啥区别),最右边丢弃,最左边补1。位移如果超过或等于最大位数,实际位移数为:位移数%类型的位数(下面例子是int类型,位数为32)
/**
* 右移负数
*/
@Test
public void rightShiftNegativeNumber() {
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111010 -> 10000000 00000000 00000000 00000101
System.out.println("-10 >> 1 = " + (-10 >> 1));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111101 -> 11111111 11111111 11111111 11111100 -> 10000000 00000000 00000000 00000011
System.out.println("-10 >> 2 = " + (-10 >> 2));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111110 -> 11111111 11111111 11111111 11111101 -> 10000000 00000000 00000000 00000010
System.out.println("-10 >> 3 = " + (-10 >> 3));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111111 -> 11111111 11111111 11111111 11111110 -> 10000000 00000000 00000000 00000001
System.out.println("-10 >> 4 = " + (-10 >> 4));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111111 -> 11111111 11111111 11111111 11111110 -> 10000000 00000000 00000000 00000001
System.out.println("-10 >> 5 = " + (-10 >> 5));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111111 -> 11111111 11111111 11111111 11111110 -> 10000000 00000000 00000000 00000001
System.out.println("-10 >> 31 = " + (-10 >> 31));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11110110 -> 11111111 11111111 11111111 11110101 -> 10000000 00000000 00000000 00001010
System.out.println("-10 >> 32 = " + (-10 >> 32));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111010 -> 10000000 00000000 00000000 00000101
System.out.println("-10 >> 33 = " + (-10 >> 33));
}
输出:
3:无符号右移
正数无符号右移:与右移相同
/**
* 无符号右移正数
*/
@Test
public void unsignedRightShiftPositiveNumber() {
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
System.out.println("10 >>> 1 = " + (10 >>> 1));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000010
System.out.println("10 >>> 2 = " + (10 >>> 2));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000001
System.out.println("10 >>> 3 = " + (10 >>> 3));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 >>> 4 = " + (10 >>> 4));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 >>> 5 = " + (10 >>> 5));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
System.out.println("10 >>> 31 = " + (10 >>> 31));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00001010
System.out.println("10 >>> 32 = " + (10 >>> 32));
// 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
System.out.println("10 >>> 33 = " + (10 >>> 33));
}
输出:
负数无符号位移:与右边不同,符号跟着移动,最左边补0,只要移动就会变成正数
/**
* 无符号右移负数
*/
@Test
public void unsignedRightShiftNegativeNumber() {
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 01111111 11111111 11111111 11111011
System.out.println("-10 >>> 1 = " + (-10 >>> 1));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00111111 11111111 11111111 11111101
System.out.println("-10 >>> 2 = " + (-10 >>> 2));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00011111 11111111 11111111 11111110
System.out.println("-10 >>> 3 = " + (-10 >>> 3));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00001111 11111111 11111111 11111111
System.out.println("-10 >>> 4 = " + (-10 >>> 4));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00000111 11111111 11111111 11111111
System.out.println("-10 >>> 5 = " + (-10 >>> 5));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00000000 00000000 00000000 00000001
System.out.println("-10 >>> 31 = " + (-10 >>> 31));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 11111111 11111111 11111111 11110110
System.out.println("-10 >>> 32 = " + (-10 >>> 32));
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 01111111 11111111 11111111 11111011
System.out.println("-10 >>> 33 = " + (-10 >>> 33));
}
输出:
4:取反运算:1变成0,0变成1,符号位也会取反
/**
* 取反运算
*/
@Test
public void negateTest() {
// 00000000 00000000 00000000 00001010
// 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110100 -> 10000000 00000000 00000000 00001011
System.out.println("~10 = " + ~10);
// 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
// 00000000 00000000 00000000 00001001
System.out.println("~-10 = " + ~-10);
}
输出:
5:与运算:都是1则为1,否则为0,符号位也一起运算
/**
* 与运算
*/
@Test
public void andOperationTest() {
// 00000000 00000000 00000000 00001010 & 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000000
System.out.println("10 & 4 = " + (10 & 4));
// 10000000 00000000 00000000 00000100 -> 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111100
// 00000000 00000000 00000000 00001010 & 11111111 11111111 11111111 11111100
// 00000000 00000000 00000000 00001000
System.out.println("10 & -4 = " + (10 & -4));
}
输出:
6:或运算:只要有一个为1就是1,否则为0,符号位也一起运算
/**
* 或运算
*/
@Test
public void orOperationTest() {
// 00000000 00000000 00000000 00001010 | 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00001110
System.out.println("10 | 4 = " + (10 | 4));
// 10000000 00000000 00000000 00000100 -> 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111100
// 00000000 00000000 00000000 00001010 | 11111111 11111111 11111111 11111100
// 11111111 11111111 11111111 11111110 -> 11111111 11111111 11111111 11111101 -> 10000000 00000000 00000000 00000010
System.out.println("10 | -4 = " + (10 | -4));
}
输出:
7:异或运算:相同为0,不同为1,符号位也一起运算
/**
* 异或运算
*/
@Test
public void exclusiveOrOperationTest() {
// 00000000 00000000 00000000 00001010 ^ 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00001110
System.out.println("10 ^ 4 = " + (10 ^ 4));
// 10000000 00000000 00000000 00000100 -> 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111100
// 00000000 00000000 00000000 00001010 ^ 11111111 11111111 11111111 11111100
// 11111111 11111111 11111111 11110110 -> 11111111 11111111 11111111 11110101 -> 10000000 00000000 00000000 00001010
System.out.println("10 ^ -4 = " + (10 ^ -4));
}
输出: