C语言几道位移运算题
当前位置:以往代写 > C/C++ 教程 >C语言几道位移运算题
2019-06-13

C语言几道位移运算题

C语言几道位移运算题

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再向下取整。

    关键字:

在线提交作业