• 几道位移运算题


    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是多少?

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

    因为-1310是-11012,则补码是1111....0011,则右移2位则为1111...1100。所以最后结果是-1002,即结果是-410

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

  • 相关阅读:
    CUBRID学习笔记 4 端口和win7下连接数据库cubrid教程
    CUBRID学习笔记 3 net连接数据库并使用cubrid教程示例
    CUBRID学习笔记 2 安装教程
    CUBRID学习笔记 1 简介 cubrid教程
    vs无法打开项目的解决方案
    迷你sql profile,给缺少sql跟踪的朋友们
    EntityFramework 开始小试
    网站安全扫描工具--Netsparker的使用
    ServiceStack.OrmLite 笔记10-group having 分页orderby等
    pyqt5 笔记(四)cx_Freeze 实现代码打包exe
  • 原文地址:https://www.cnblogs.com/justany/p/2879925.html
Copyright © 2020-2023  润新知