【问题标题】:Why the expression -3 >> 1 results in -2? [duplicate]为什么表达式 -3 >> 1 的结果是 -2? [复制]
【发布时间】:2019-09-05 07:28:37
【问题描述】:

我在 java 中运行这个 (-3 >> 1) 并得到答案 -2 但根据我的说法,它应该是 -1,因为我想这就像 -3/2。请帮助我理解这一点。

int x = -3 >> 1;
System.out.println(x + " " + (-3 >> 1));

【问题讨论】:

  • @ItFreak 那是错误的。因为int 是有符号的并且-3 是负数,所以向右移动时会得到一个1 位。
  • 哦,是的,你说得对
  • 还要注意 -1 >> 1 == -1(考虑冒无限循环的风险)。 -n >> 1 == - (n/2) - (n%2)

标签: java


【解决方案1】:

答案来自Java中-3的二进制表示,即

11111111111111111111111111111101

当您将这些位右移一位时,您会得到

11111111111111111111111111111110

这是-2。

【讨论】:

【解决方案2】:

因为负数被保存为算术运算的 2 的补码

用 2 的补码表示 -3

+3 -> 0011

补->1100

加 1 -> 0001

-3 -> 1101

右移操作后,值将是 1110,因为对负数进行右移操作,最左边的位加 1。

链接Why does right shifting negative numbers in C bring 1 on the left-most bits?

在 2 的补码中表示 -2

+2 -> 0010

补-> 1101

加 1 ->0001

-2 = -> 1110

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 2013-10-02
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多