gpt4 book ai didi

java - 按位取反给出意想不到的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:21 25 4
gpt4 key购买 nike

我正在尝试用 Java 编写一个按位计算器,您可以输入诸如 ~101 之类的表达式,但是当我运行这段代码时它会返回 10

import java.util.Scanner;

public class Test
{
public static void main(String[] args)
{
Integer a = Integer.valueOf("101", 2);
System.out.println(Integer.toString(~a,2));
}
}

它输出 -110 为什么?

最佳答案

您假设 101 的长度为三位。 Java 不支持变长位操作,它对整个 int 位进行操作,所以 ~ 将是 32 位的 not长“101”。

--- 在被问及“我该如何解决这个问题?”后进行编辑---

这是一个非常好的问题,但答案是“你不能”和“你可以通过不同的方式实现同​​样的事情”的混合体。

您无法修复 ~ 运算符,因为它会做它该做的事情。这有点像要求修复 + 以仅添加 1 的位置。只是不会发生。

您可以实现所需的操作,但是您需要更多的“东西”才能让它运行。首先,您必须有东西(另一个整数)来指定感兴趣的。这通常称为位掩码

 int mask = 0x00000007; // just the last 3 bits.

int masked_inverse = (~value) & mask;

请注意,我们所做的实际上是反转 32 位,然后将其中的 29 位清零;因为,它们在掩码中被设置为零,这意味着“我们不关心它们”。这也可以想象为利用 & 运算符,这样我们就可以说“如果设置并且我们关心它,请设置它”。

现在您仍然有 32 位,但只有低 3 位会被反转。如果你想要一个 3 位的数据结构,那就另当别论了。 Java(和大多数语言)只是不直接支持这些东西。因此,您可能想向 Java 添加另一种类型 来支持它。 Java 通过 class 机制添加类型,但内置类型是不可更改的。这意味着您可以编写一个类来表示 3 位数据结构,但它必须在内部将 int 处理为 32 位字段。

幸运的是,有人已经这样做了。它是标准 Java 库的一部分,并且 is called a BitSet .

BitSet threeBits = new BitSet(3);
threeBits.set(2); // set bit index 2
threeBits.set(0); // set bit index 0
threeBits.flip(0,3);

但是,由于 Java 中的类/对象系统的限制,此类位操作对它们有不同的感觉,这源于将类定义为在 Java 中添加新类型的唯一方式

关于java - 按位取反给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15575520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com