几道位移运算题

系统 1645 0

1 << -1

1 << -1是多少?

字面上看1左移-1位,似乎是1右移1位的意思。

但实际结果却是-2147483648,而-2147483648 = - 2 31

也就是说实际上1 << -1等同于:

1 << 31

为什么?╮(╯_╰)╭没有什么为什么,就是这样定义的,可以说为了配合Javascript中整型是32位的吧。

也就是说m << -n等同于:

m << (-n % 32 + 32)

在c语言中,这样写编译的时候会抛错的。

但是,Java中的这个式子的结果和Javascript中相同。准确的说是在运算数字为32位整形的时候。比如如果我们将数字改成长整形,其结果有不同了。

      
        public
      
      
        class
      
      
         test{
    
      
      
        public
      
      
        static
      
      
        void
      
      
         main(String[] args){
        System.out.println(
      
      1L << -1);    
      
        //
      
      
         -9223372036854775808
      
      
            }
    
}
      
    

 

那么1 >> -1呢?

左移负数位,似乎是固定为0的。

无论哪个数来移,移多少位都一样。

      alert(1 >> -1)    
      
        //
      
      
         0
      
    

 

(1 << 31)为什么是负数

首先位移运算是基于补码的,所以先复习一下补码的知识。

正整数的补码就是其本身。

负整数的补码是, 其符号位不变,数值部分的各位取反,然后整个数加1。

(32位整数-2147483648有些特别,其二进制表示是-10000000000000000000000000000000,而且补码是 10000000000000000000000000000000

所以1的补码是 00000000000000000000000000000001,左移31位就变成了 10000000000000000000000000000000,即 -2147483648。

 

(1 << 31) - 1是多少?

因为1 << 31是32位整形最小能表示的数字,在Java中这个式子的结果是2147483647,也就是说溢出然后变成所能表示的最大整数了。

但Javascript不太相同,这个式子的结果是-2147483649,因为Javascript引擎自动将其变成64位浮点数来表示了。

 

一道笔试题

-13 >> 2是多少?

讲了这么多,这道题就很简单了。

因为-13 10 是-1101 2 ,则补码是1111....0011,则右移2位则为1111...1100。所以最后结果是-100 2 ,即结果是-4 10

我们也可以记住,右移1位操作是除以2再向下取整。

 

几道位移运算题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论