我最近正在研究 Java 中的 but 操作的一些问题,并提出了两个问题。
1) 首先,我遇到了翻转数字中所有位的问题。
我找到了这个解决方案:
public class Solution {
public int flipAllBits(int num) {
int mask = (1 << (int)Math.floor(Math.log(num)/Math.log(2))+1) - 1;
return num ^ mask;
}
}
但是当 k = 32 位时会发生什么? 1可以移位33次吗?
我从代码中了解到(虽然它实际上没有意义),掩码是 0111111.(31 1's)....1 而不是 32 1's,正如有人所期望的那样。因此,当 num 是一个非常大的数字时,这将会失败。
2) 另一个问题我遇到的是确定什么时候某个东西是 2 补码的位序列或只是一个正常的位序列。例如,我读到 1010 翻转后是 0110,即 -10,但也是 6。它是哪一个,我们怎么知道?
谢谢。
最佳答案
1) Math 对象调用不是必需的。在 Java(或 C)中翻转任何序数类型中的所有位都不是算术运算。这是一个按位运算。使用“^”运算符,只需使用 1- 作为操作数即可,无论 C/C++ 中 int 的大小或以序数类型作为参数 T 的 Java 模板如何。波形符“~”运算符是另一个选项。
T i = 0xf0f0f0f0;
System.out.println(T.toHexString(i));
i ^= -1;
System.out.println(T.toHexString(i));
i = ~ i;
System.out.println(T.toHexString(i));
2) 由于整个整数范围映射到 2 的补码变换中的整个整数范围,因此不可能检测一个数字是否是 2 的补码,除非知道 2 的补码来自的数字范围可以计算补集,并且两个集合(之前和之后)是互斥的。
关于java - Java 中的位操作 - 2 的补码和翻转位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41966016/