Java基础语法(五)—位运算符

5.位运算符

题外话:我们都知道,在计算机中,参与计算的都是二进制数据,而二进制数据又分为原码、反码、补码,运算的时候都是用补码来运算。

(1)<<:将参与运算的二进制数据向 左 移动,在低位产生的空位用 0 来补齐。

注意:在java中,整数的默认类型为 int 型,也就是32位,而为了在下文中叙述方便,我就使用8位的byte型了。

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

        byte a = 7;
        // 把a变量的二进制的值左移2位
        System.out.println(a << 2); // 输出结果:28
    }
}
整数 7 的二进制形式:00000111
整数 7 的二进制左移两位:00011100
———-
class Demo1{    
    public static void main(String[] args){

        byte a = -7;
        // 把a变量的二进制的值左移2位
        System.out.println(a << 2); // 输出结果:-28
    }
}
-7 原码:10000111
    反码:11111000
    补码:11111001
    补码:(左移之后)11100100
    反码:11100011
    原码:10011100

      在这里需要简单解释一下,因为计算机的运算都是以补码的形式进行,而最高位的 0 或 1 代表的是符号位正或负,(以前不清楚这一点,正数的时候还好,一旦遭遇负数,脑子一团浆糊)。那么我们十进制的-7在进行移位运算之前,需要先转换成补码形式,然后才可以移位,(不要觉得我们进行到这里就结束了哈)实际上我们在控制台输出的还是 十进制的数,所以还要将移位之后的补码再转换成原码才行。
      原码、反码、补码之间的转换我在之前的《java基础语法(二)》中就有过介绍,在这里我再说明一下吧:
      正数:原码=反码=补码
      负数:原码变反码:最高位符号位不变,其他数值位 0变1、1变0。
                反码变补码:反码加1即可得。


(2)>>:(带符号右移)将参与运算的二进制数据向右移动,在高位产生的空位:如果高位是0,就用0补齐;如果高位是1,就用1补齐。

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

        byte a = 7;
        // 把a变量的二进制的值右移2位
        System.out.println(a >> 2); // 输出结果:1
    }
}
整数 7 的二进制形式:00000111
整数 7 的二进制右移两位:00000001
———-
class Demo1{    
    public static void main(String[] args){

        byte a = -7;
        // 把a变量的二进制的值右移2位
        System.out.println(a >> 2); // 输出结果:-2

    }
}
-7 原码:10000111
    反码:11111000
    补码:11111001
    补码:(右移之后)11111110
    反码:11111101
    原码:10000010

负数的带符号右移运算的原理同左移原理相同,这里就不赘述了。


(3)>>>:(无符号右移)将参与运算的二进制数据向右移动,在高位所产生的空位用 0 补齐。

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

        byte a = 7;
        System.out.println(a >>> 2); // 输出结果:1  
    }
}

正数的无符号右移和正数的带符号右移的结果相同。所以相对来说,正数的无符号右移其实没有啥太大的意义。

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

        int a = -7;
        System.out.println(a >>> 2); // 输出结果:1073741822

    }
}
-7原码:1000 00000000 00000000 00000000 0111
    反码:1111 11111111 11111111 11111111 1000
    补码:1111 11111111 11111111 11111111 1001
    补码:(右移之后)0011 11111111 11111111 11111111 1110

注意:无符号右移只是对32位和64位的值有意义。上图中,右移后的补码最高符号位为0,所以为正数,所以原码就是它本身,那么转换成十进制之后的值为:1073741822

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值