您假设 101 是三位长。Java 不支持可变长度位操作,它对整个int
位进行操作,因此~
将是not
32 位长的“101”。
--- 在被问到“我该如何解决这个问题?”后编辑。---
这是一个非常好的问题,但答案是“你不能”和“你可以通过不同的方式实现同样的事情”的混合体。
您无法修复~
操作员,因为它会做它所做的事情。这有点像要求修复+
只添加 1 的位置。只是不会发生。
您可以实现所需的操作,但您需要更多的“东西”来实现它。首先,您必须有一些东西(另一个 int)来指定感兴趣的位。这通常称为位掩码。
int mask = 0x00000007; // just the last 3 bits.
int masked_inverse = (~value) & mask;
请注意,我们所做的实际上是反转 32 位,然后将其中的 29 位归零;因为,它们在掩码中被设置为零,这意味着“我们不关心它们”。这也可以想象为利用&
运营商,例如我们说“如果设置并且我们关心它,请设置它”。
现在你仍然有 32 位,但只有低 3 位会被反转。如果你想要一个 3 位数据结构,那就另当别论了。Java(和大多数语言)只是不直接支持这些东西。因此,您可能很想向 Java 添加另一种类型来支持它。Java 通过类机制添加类型,但内置类型是不可更改的。这意味着您可以编写一个类来表示一个 3 位数据结构,但它必须在内部将整数处理为 32 位字段。
对你来说幸运的是,已经有人这样做了。它是标准 Java 库的一部分,称为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 中添加新类型的唯一方法。