【问题标题】:Why ~1 returns -2 rather than 0 in Java? [duplicate]为什么〜1在Java中返回-2而不是0? [复制]
【发布时间】:2019-03-19 09:57:46
【问题描述】:

我试图否定(a.k.a invert)给定 int 的所有位。

假设给定数字的(给定数字是 5)二进制表示是 101,它的否定(我的输出)应该是 010。

我对从最低有效位到最高有效位的每一位都使用 ~ 来否定它。

public static void main (String[] args) throws java.lang.Exception
    {
        // your code go
        int num = 5;
        String givenNumInBinary = Integer.toBinaryString(num);
        StringBuffer output = new StringBuffer();

        for(int i = 0; i <= givenNumInBinary.length()-1;i++){
            int msb = Character.getNumericValue(givenNumInBinary.charAt(i));
            output.append(~msb);
        } 
        System.out.println(output.toString());
    }

我的输出结果是 -2-1-2

这是为什么呢?我做错了什么?

【问题讨论】:

  • @TimBiegeleisen 完成。
  • 如果重复链接仍然让您感到疑惑,请尝试康奈尔计算机科学部门的reading this good tutorial。基本上,您只需要弄清楚 2 的恭维是如何工作的。
  • @TimBiegeleisen 我阅读了答案和文章。我还是不明白。我的问题很简单。二进制补码中的5101。否定每一位应该是010。为什么我收到-2-1-2??
  • 因为您要逐个否定每个数字。也许下面的@wombat 答案是您打算做的,但实际上并没有做。
  • @TimBiegeleisen 那么,类似于 ^、& 和 | 的二进制否定表是什么? ?这是&,|的表格和^imgur.com/a/V4w5JdG

标签: java bit-manipulation bit negate


【解决方案1】:

因为您在

处反转每个 digit
int msb = Character.getNumericValue(givenNumInBinary.charAt(i));
output.append(~msb);

而不是反转每个

替代解决方案是

output.append(msb == 0 ? 1 : 0);
....
System.out.println(output.toString());

输出

010

【讨论】:

  • 感谢您的回答。二进制补码中的 5 是 101。否定每个位应该是 010。为什么我得到 -2-1-2(这是我的问题)。我不是在寻求替代解决方案。
  • 因为你没有反转你正在反转数字 1 的位
  • 你去。你用解释把它钉住了。谢谢。
猜你喜欢
  • 2022-12-16
  • 2016-08-29
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2012-12-12
  • 2015-07-23
相关资源
最近更新 更多