Java 左移运算符注意事项

简单的我们知道左移一位表示乘以2,像1<<2=4。但是左移个几百位呢?1<<100=??

一个int占32位,一个long才占64位,左移几百位真要乘这么多2的话,肯定是存不下的。比如以下代码:

 System.out.println("1 << 100 = " + (1 << 100));
 System.out.println("1L << 100 = " + (1L << 100));

按照我们的猜测的话,左移高位可能会被舍弃,所以只要左移超过最大的位数结果应该是0,但是上述代码的结果为:

1 << 100 = 16
1L << 100 =  68719476736

我们看到,100位已经超过int和long的最大位数了,但是左移的结果并不是0。根据结果我们能猜的出来,虚拟机在做移位操作的时候对移位位数根据当前数据类型做了取余操作。也就是如果是int类型变量左移,会把需要左移的位数和32取余,long类型变量则会根据64位取余:

1 << n == 1 << (n % 32)
1L << n == 1 << (n % 64)

我们看一下以下代码:

        System.out.println("1 << (100 % 32) = " + (1 << (100 % 32)));
        System.out.println("1 << 100 = " + (1 << 100));

        System.out.println("1L << 100 = " + (1L << 100));
        System.out.println("1L << (100 % 64) = " + (1L << (100 % 64)));

输出为:

1 << (100 % 32) = 16
1 << 100 = 16
1L << 100 = 68719476736
1L << (100 % 64) = 68719476736

注:特别要注意,像byte类型的变量在做移位等操作的时候会将其转换为int,所以在操作的时候需要注意。感兴趣的同学可以试验一下。

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值