美文网首页
2018-04-24 JAVA 移位运算符

2018-04-24 JAVA 移位运算符

作者: MiaLing007 | 来源:发表于2018-04-24 17:54 被阅读0次

移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。
有三种移位运算符 (<<,>>,>>>)

1,<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3

2,>> 有符号右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3

3,>>> 无符号右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. x>>>3

因为计算机中int是以补码存储的,所以实际运行时是以补码形式来进行移位操作的
例如
10 的补码为00000000 00000000 00000000 00001010(正数的反码,补码跟原码相同)

            00000000 00000000 00000000 00001010
 10 << 2    00000000 00000000 00000000 00101000    左侧舍弃2位,右侧补0  结果:40
 10 >> 2    00000000 00000000 00000000 00000010    左侧补2个0(正数),右侧舍弃两位 结果:2
 10 >>>2    00000000 00000000 00000000 00000010    左侧补2个0,右侧舍弃两位  结果:2

-10的补码为11111111 11111111 11111111 11110110

            11111111 11111111 11111111 11110110
-10 << 2    11111111 11111111 11111111 11011000    左侧舍弃2位,右侧补0 结果:-40
-10 >> 2    11111111 11111111 11111111 11111101    左侧补2个1(负数),右侧舍弃两位  结果:-3
-10 >>>2    00111111 11111111 11111111 11111101    左侧补2个0,右侧舍弃两位  结果:1073741821

通过上边的,我们可以发现
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
10 << n = 10 * 2^n

对于正数右移,则相当于除以2的n次方(取整) 10 >> n = 10/2^n
10 >> 2 相当于 10 / 2^2 = 2
但对于负数的右移,就没有什么算术意义

从计算速度上讲,移位运算要比算术运算快,所以我们可以在条件满足情况下采用移位来代替乘除法

如果位移之后的数字已经越界了,则就失去了代替乘除法的意义了

public class AA {
        public static void main(String args[]) {

        System.out.println("正数10位移");
        System.out.println("10<<2 = " + (10 << 2));
        System.out.println("10>>2 = " + (10 >> 2));
        System.out.println("10>>>2 = " + (10 >>> 2));
        System.out.println("-----------------------");
        System.out.println("负数-10位移");
        System.out.println("-10<<2 = " + (-10 << 2));
        System.out.println("-10>>2 = " + (-10 >> 2));
        System.out.println("-10>>>2 = " + (-10 >>> 2));
        System.out.println("Integer.MAX_VALUE:"+Integer.MAX_VALUE);
        System.out.println("1073741823 << 1 = "+ (1073741823 << 1));//1073741823左移一位相当于乘2 得到结果为2147483646,未越界
        System.out.println("1073741824 << 1 = "+ (1073741824 << 1));//1073741823左移一位相当于乘2 得到结果为2147483648,越界
        
    }
}

计算结果:

正数10位移
10<<2 = 40
10>>2 = 2
10>>>2 = 2
-----------------------
负数-10位移
-10<<2 = -40
-10>>2 = -3
-10>>>2 = 1073741821
Integer.MAX_VALUE:2147483647
1073741823 << 1 = 2147483646
1073741824 << 1 = -2147483648

相关文章

  • java中有三种移位运算符

    java中有三种移位运算符

  • java移位运算符

    转自http://www.iteye.com/topic/766461 移位运算符 java移位运算符不外乎就这三...

  • 位运算(位掩码BitMask)的简单应用场景浅析

    在Java中,位运算符有:与(&)、非(~)、或(|)、异或(^)、移位(<< 和 >>)、无符移位(<<< 和 ...

  • 2018-04-24 JAVA 移位运算符

    移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。有三种移位运算符 (<<,>>,>>>...

  • java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 : ...

  • hashmap中的一些小点(个人总结)

    capacity <<= 1: java中有三种移位运算符: // <<:左移运算符,num << 1,相当于n...

  • java位运算

    Java 位运算(移位、位与、或、异或、非) Java提供的位运算符有:左移( << )、右移( >> ) 、无符...

  • 图解java中的移位运算符<<,>>,&

    一. Java中的三种移位运算符<<,>>,>>>1. << 左移运算符,num<<1,相当于num乘以22. >...

  • 浅谈Java中移位运算符

    引言 Java中移位运算符一共有三种,<<(左移)、>>(右移)、>>>(无符号右移)。下面我分别介绍这三种移位运...

  • java 移位运算符

    最近工作中被运算效率问题所困扰,比如大数据排序或者去重,因此现在需要补习一下位移运算。 首先讲一下位移概念? 左位...

网友评论

      本文标题:2018-04-24 JAVA 移位运算符

      本文链接:https://www.haomeiwen.com/subject/hfwjlftx.html