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