移位运算代码如下:
package SimpleGrammar;
/**
*
* @author jaloli
*
* (1)负数存储:java 等同于机器,都是用补码存,补码的规矩,
* 负数 -2 ,原码为 10000000000000000000000000000010
* 补码是符号位不变,各位取反+1,补码为 11111111111111111111111111111110
*
* (2)负数移位:(说的是 >> << 移位符号,不是>>>,>> << 这种是带符号移位) 两种移位理解方式,
* 一种是原码移位,再转补码,此时是符号位不变,左移右移都补0
* 另一种是补码直接移位,右移补1,左移补0
* (3) >>移位方式与除法的区别: -2>>10 = -1,可看下面运算过程第二个printf,也就是和除法不同,
* 你右移多少位,也移不出0来,最多是-1,除法可以 -1 / 2 == 0
* (4) >>> 是不带符号移位:1.只对64 位存储的二进制数有效.java int 是32 位(如下程序显示),所以移位结果不是期待的数
* 2.移位:这个只有右移,无论正负数,统统右移不补0,移几位,砍掉前多少位,10100>>>2 = 101,然后结果101按照正数来看
* >>> 作用存疑
* (5) ~ 取反:取反就是连同符号位一起取反,高位0 扔掉
*/
public class ShiftBit {
public static String printBinary(int number) {
return Integer.toBinaryString(number);
}
public static void main(String[] args) {
int oldValue = -20; //改成20 看,2,-2 试试
int shiftNum = 2;
//oldValue is : 11111111111111111111111111101100 原数为:-20
System.out.println("oldValue is : \t\t" + printBinary(oldValue) + "\t原数为:" + oldValue);
//oldValue >> 2 : 11111111111111111111111111111011 运算十进制结果为: -5
System.out.println("oldValue >> 2 : \t" + printBinary(oldValue >> shiftNum) + " \t运算十进制结果为: " + (oldValue >> shiftNum));
//oldValue << 2 : 11111111111111111111111110110000 运算十进制结果为: -80
System.out.println("oldValue << 2 : \t" + printBinary(oldValue << shiftNum) + " \t运算十进制结果为: " + (oldValue << shiftNum));
//oldValue >>> 2 : 111111111111111111111111111011 运算十进制结果为: 1073741819 这个相当于把左边的两位砍掉了,没补0,缺位了,移几位缺几位.1073741819 数按照无符号正数算出来的
System.out.println("oldValue >>> 2 : \t" + printBinary(oldValue >>> shiftNum) + " \t\t运算十进制结果为: " + (oldValue >>> shiftNum));
//取反操作符,~-2
System.out.println("oldValue 取反 is : \t\t" + printBinary(~oldValue) + "\t原数为:" + oldValue);
}
}