JAVA位移运算符了解`<< >> >>>`

来源:互联网 发布:mac mysql 入门教程 编辑:程序博客网 时间:2024/05/06 15:14
//如果你开始读了,那么一定要读到末尾才有收获public static void main(String[] args) {  // 关于位移运算的测试  // 带符号位移: << >>  int a = 1;// int类型4字节32位 00000000 00000000 00000000 00000001  int b = -1;// 同样是int 这个符号位怎么表示啊?答案是用补码表示 11111111 11111111 11111111        // 11111111  // 但是我们怎么判断这个数表示的是 -1 而不是//通过以下两个输出可以得到结果  System.out.println(Integer.MAX_VALUE);  // 2147483647  // 01111111 11111111 11111111 11111111——也就是说第一位是符号位。  System.out.println(Integer.MIN_VALUE);  // -2147483648  // -10000000 00000000 00000000 00000000  // 补 10000000 00000000 00000000 00000000  // 接下来我们对a和b进行位移运算  System.out.println(a);  System.out.println(a >> 1);  System.out.println(a << 1);//预测2  System.out.println(b);  System.out.println(b >> 1);  System.out.println(b << 1);//预测11111111 11111111 11111110—— -2  //输出 1 0 2 -1 -1 -2  //带符号右移高位空出的地方补符号位,可以理解为符号位也右移,空位补符号位  //如果向右移动符号位补全高位空缺,如果向左移动,地位空缺通通由0补全  //还有一点缺陷,我们所做的测试中用的例子的二进制数前31位都是相同的,无法判断符号位到底是否跟随移动了  //也就是说左移的测试是准确的,但是右移的测试是不一定准确的接下来我们用不同的数据进行测试  int c=1610612736;//01100000 00000000 00000000 00000000  System.out.println(c << 1);//如果符号位不动得到的就是1073741824//否则是负数  //输出是负数那就没有任何疑问了  //====================================================================================  // 无符号位移: 注意这里只有右移,没有左移>>>  //预测是右移符号位不动  System.out.println(c >>> 1);//注意现在是无符号移动了——预测为  805306368  //ok了,这里是符号位不动,空位补0}
0 0
原创粉丝点击