zoukankan      html  css  js  c++  java
  • Java中的左移时的负数问题

    java 中的左移的运算符为<<,其作用是返回把左侧的数字左移右侧数字的位数的结果,其规则为:丢弃最高为,0补最低位。因此,左移可以用作乘2操作的一个高效的实现。

    但是使用的时候要注意符号位的问题,如下:

    public void shiftTest() {
        int n = 1;
        while (n != 0) {
            n = n << 1;
            System.out.println(Integer.toBinaryString(n));
        }
    }
    

    输出:

    10
    100
    1000
    10000
    100000
    1000000
    10000000
    100000000
    1000000000
    10000000000
    100000000000
    1000000000000
    10000000000000
    100000000000000
    1000000000000000
    10000000000000000
    100000000000000000
    1000000000000000000
    10000000000000000000
    100000000000000000000
    1000000000000000000000
    10000000000000000000000
    100000000000000000000000
    1000000000000000000000000
    10000000000000000000000000
    100000000000000000000000000
    1000000000000000000000000000
    10000000000000000000000000000
    100000000000000000000000000000
    1000000000000000000000000000000
    10000000000000000000000000000000
    0
    

    这里需要关注的是最后两行的输出。

    首先是倒数第二行,我们把数字每4位分隔开来看,为1000 0000 0000 0000 0000 0000 0000 0000,回想一下,Java中的int型的数据是32位的有符号数,并且第一位为符号位,而当前这个数字已经显示为32位了,因此说明初始的1已经被位移到了整个int的首位,也就是符号位,此时,这个数字已经变成了一个负数,并且值为Java中int的最小值:-2147483648

    而最后一行,说明此时,1在被位移至整个int的最左边之后,再次左移,此时被移除了整个数字,而整个数字变为了0。

    还有一点要注意的是,Java中int的位数为32,因此若左移运算符右侧的数字大于32的话,实际运算的位移的位数为其对32取余的数字。

    如:

    n = 1;
    System.out.println(n << 33);
    

    输出:

    2
    

    因为33 % 32 = 1,所以,实际结果为将1 左移1位的结果,即2。

  • 相关阅读:
    教你Python3实现12306火车票自动抢票,小白必学
    Spring Security 中如何快速查看登录 IP地址等信息?一招搞定
    方程组及其解的判定
    向量空间
    极大无关组和向量组等价
    向量组的线性相关与线性无关
    向量间的线性关系
    向量的概念和运算
    矩阵的秩和秩的性质
    利用初等变换求逆矩阵和解矩阵方程
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744395.html
Copyright © 2011-2022 走看看