【问题标题】:System.out.println(16 >>> 3)? [duplicate]System.out.println(16 >>> 3)? [复制]
【发布时间】:2013-07-08 20:24:49
【问题描述】:

我试试代码

System.out.println( 16 >>> 3);

输出为 2 !

但这是如何工作的?语法是什么?

【问题讨论】:

  • 除以 3 次。但只能对 8 的倍数进行精确除法;
  • 不确定我是否理解所有的赞成票。在我看来,没有研究的迹象。拒绝我的投票。
  • @delnan 不相信这是重复的。这似乎只是关于>>> 运算符的另一个问题。
  • @Duncan,其“输出为 2!”它只是让我发痒。也许我需要更多的睡眠

标签: java jvm


【解决方案1】:

您正在使用按位移位咨询 this post

在二进制中,每 0 是 2 次方的递增幅度,例如:

10000 = 16

01000 = 8

00100 = 4

00010 = 2

00001 = 1

java 中的表达式 16 >>> 3 表示将位移动 3 个位置,所以我们只剩下 2。

【讨论】:

    【解决方案2】:

    这称为 right-shift,带有 zero-fill(也称为 - unsigned right shift)。

    为了便于理解,对于每个班次,您的数字除以 2。所以:

    16 >>> 3  ==  16 / 2^3 == 16 / 8 == 2
    

    更多详情请见JLS - Shift Operators

    为了真正的可视化,看一下两个数字的位表示:

    16        - 00010000
    16 >>> 3  - 00000010 == 2
    

    【讨论】:

      【解决方案3】:

      >>> 运算符正在执行无符号位右移,当应用于整数时,它具有除以二的效果。特别是,如果整数是 2 的幂,则每次右移都会使值减半。例如:

      16 >>> 1 // returns 8
      16 >>> 2 // returns 4
      16 >>> 3 // returns 2
      

      在二进制形式中,16 表示为10000。如果我们将该值向右移动 3 次,则它最终为00010,即2。另外,看看 Java tutorial

      【讨论】:

        【解决方案4】:

        二进制中的 16 是 00010000。您正在将位向右移动三个位置,这导致 00000010 是 2

        【讨论】:

          【解决方案5】:

          这是一个位移,除以 2^3(由于位移 3 个位置)和截断(向下舍入),因为我们不进行填充。

          当使用>>> 时,我们向右移动并划分。 当使用<<< 时,它正好相反,所以你需要乘以 2 的正确幂。

          位移是bitwise operation 的一种类型,它直接对原始(几乎总是数字)位进行操作。

          【讨论】:

            【解决方案6】:

            这是一个无符号右移运算符,上面的移位3次。

            即它每次除以 2,得到 2

            有关 Java 运算符的更多信息,请参阅here

            【讨论】:

              【解决方案7】:

              16 >> 3 是右移,相当于除以 8 (2 ** 3)。

              16 -> 00010000
                       ^
                        \
                         \
              2 ->  00000010
              

              【讨论】:

              • +1 用于 ASCII 艺术!
              【解决方案8】:

              另外注意,3 个 V 形表示 无符号 右位移。虽然在这个例子中没有什么区别......

              多余的>表示该标志不保留,举例:

              -128 >> 2 = -128 / 2^2 = -32
              

              有符号位被保留给:

              (1) 10000000 >> 2 = (1) 100000 
              11111111 11111111 11111111 10000000 >> 2 = 1111111 11111111 11111111 11100000
              

              如果使用>>>,则符号位也会被移位,将其转换为正数。

              -128 >>> 2 = 536870896
              
              11111111 11111111 11111111 10000000 >> 2 = 0011111 11111111 11111111 11100000
              

              【讨论】:

              • 我有兴趣看看它会产生影响的例子,负数会乘以 2 吗?
              • 尝试谷歌一下,网上已经有很多例子了,甚至还有。但基本上没有,负数不乘以 2。有符号位不保留,所以它们变成了一些正值。例如,考虑有符号(32 位)整数 -128:11111111 11111111 11111111 10000000。如果我们执行 (-128 >>> 3),则得到 536870896。因为有符号位被移位以给出 00011111 11111111 11111111 11110000
              • 很公平,我的意思是这会让你的答案很棒,我会支持它,但很公平,我会继续前进
              • 我想它并不能真正回答你的问题:p
              • 我的问题?我不是拉斐尔
              猜你喜欢
              • 1970-01-01
              • 2011-08-15
              • 2010-11-29
              • 1970-01-01
              • 2020-05-23
              • 2013-09-19
              • 2020-10-06
              • 2020-03-19
              • 1970-01-01
              相关资源
              最近更新 更多