Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这些右移操作员示例正确吗?_Javascript - Fatal编程技术网

Javascript 这些右移操作员示例正确吗?

Javascript 这些右移操作员示例正确吗?,javascript,Javascript,MDN上的右移操作员示例包括: 右移操作员;及 无符号右移运算符 只是对我来说没有意义。它们不仅挑战了我对两个补语的理解,还混淆了我对它们自身功能的认识。我是否遗漏了什么,或者这些示例是否需要更正 下面给出了一些令人困惑的例子,并对我的预期进行了评论 右移运算符为负数的示例如下: var条-5;//(-000000000000000000000000101) bar>>=2;//-2(-00000000000000000000000010) 首先,假设DWORD大小(32位,有符号),-5的两

MDN上的右移操作员示例包括:

  • 右移操作员;及
  • 无符号右移运算符
  • 只是对我来说没有意义。它们不仅挑战了我对两个补语的理解,还混淆了我对它们自身功能的认识。我是否遗漏了什么,或者这些示例是否需要更正

    下面给出了一些令人困惑的例子,并对我的预期进行了评论

  • 右移运算符为负数的示例如下:

    var条-5;//(-000000000000000000000000101)

    bar>>=2;//-2(-00000000000000000000000010)

    首先,假设DWORD大小(32位,有符号),
    -5
    的两个补码表示为
    11111111111 011
    。我甚至不知道上面示例中提供的表示法
    (-00000000000000000000000101)
    是什么意思

    其次,如果我只是通过阅读示例来推断其含义,它可能会说:

    取第一个操作数的正表示形式,将其右移第二个操作数位数,将其转换为十进制,然后对结果重新应用任何符号,无论是正符号还是负符号

    然而,我也试过了,根据这个解释,结果应该是
    -1
    ,而不是
    -2
    ,如下所示

    var条-5;//(-000000000000000000000000101)

    bar>>=2;//-1(-00000000000000000000000000000001)

    因此,为了测试该示例,我键入了以下JavaScript代码,并且lo!它产生了文档化的示例所声称的内容

    console.log(5>>2)//产生-2

    发生什么事了

  • 带有负数的示例如下:

    var bar=-5;//(-000000000000000000000000101)

    bar>>>=2;//1073741822(00111111111111111110)

    对于这一个,我唯一的抱怨是
    -5
    的二进制表示是错误的。如果这一点得到纠正,那么这个例子就完全有意义了。正确的例子如下:

    var bar=-5;//(11111111111111111111 011)

    bar>>>=2;//1073741822(00111111111111111110)

    如上所示,将
    11111111111111111111 011
    右移两位将产生
    00111111111111111110
    ,这将产生正数
    1073741822

    我试过了,它产生了正确的结果:

    console.log(5>>2);//生成1073741822

    我想这只是一个印刷错误

  • 1) 忽略二进制表示,因为它没有多大帮助。它实际上是有符号的二进制表示法,在计算机中并不存在,因为计算机将有符号的数字表示为2的补码,而不是有符号的二进制

    正如您所说,
    -5
    表示为
    …11111 011
    ~4
    )。将其向右移动两次,同时复制MSB以保留符号,将得到
    …11111110
    ~1
    ),这是
    -2
    的表示形式


    2) 同样地,
    -5
    的二进制表示法是正确的,但没有用处,因为这不是计算机使用的表示法。对于人类数学,
    +5(10)
    +101(2)
    相同,
    -5(10)
    -101(2)
    相同;但是计算机分别将它们表示为
    …00000101
    …11111 011

    MDN提供的示例令人困惑,因为它们没有显示负数的真正二进制表示

    -5
    的二进制表示为
    111…11111 011
    (用
    1
    填充省略号,以达到
    32位的总长度)

    >> 常规(也称为“符号传播移位”和)将位向右移位,丢弃最右边的位,并使用最左边位的值填充左侧新释放的位置

    在二者的补码二进制表示法(现在大多数计算机都使用)中,最左边的位是符号位。正数为
    0
    ,负数为
    0
    1

    -5
    的二元补码表示为:

    +---+---+---+---+---+----------+---+---+---+---+---+
    | 1 | 1 | 1 | 1 | 1 | ........ | 1 | 1 | 0 | 1 | 1 |
    +---+---+---+---+---+----------+---+---+---+---+---+
    |                                          |       |
       \------------------------------------/    ^   ^
      ^     these bits moves to the right        +---+------ these 2 bits are discarded
      |
      +---- the value of this bit is used to fill the 2 leftmost freed positions
    
    -5>>2
    111…11111110
    ,它是
    -2
    的二进制表示形式

    >>> (也称为“零填充右移位”和)也将位向右移位并丢弃最右边的位,但它始终使用
    0
    填充左侧的释放位置


    -5>>2
    00111…11111110
    这是正数
    1073741822
    =2^30-2

    请提供(1)的分步说明。如果保留MSB并向右移动2位,我将得到小数
    -66
    。如何得到66?抱歉,这次我得到
    -98
    。我将
    1111011
    (-5以10为基数)向右移动了2个位置,但MSB除外。我得到了
    1001110
    (-98base10)。它不是这样工作的。不复制MSB的右移(
    >
    )只会从左侧引入一个
    0
    0b11111011>>2=0b00111110
    。保留MSB的移位(
    >
    )将MSB复制到下一个移位;因此(假设我们使用的是8位体系结构),您将得到
    0b11111011>>2=0b11111110
    ,而不是
    10011110
    。也就是说,因为MSB是
    1
    >2
    在前面引入了两个
    1
    s,而不是两个
    0
    s,就像
    >>2
    一样。对于
    >
    ,您的意思是,除了保留MSB之外,它还将MSB中的内容复制到我们需要填充、填充的每个位置