java - Java 中的位操作 - 2 的补码和翻转位

标签 java bit-manipulation

我最近正在研究 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/

相关文章:

java - 为什么我的输入显示一个线程在另一个线程之后执行,而不是同时执行?

java - 在 Java 中处理数据库异常的更好方法

arrays - 二进制数向量的高效位改组

mysql - 权限系统最有效/最简单的方法?

algorithm - 不使用 BMI2 的 PDEP 可移植高效替代品?

java - 为什么 JLabel 不能是内部类声明

java - 用于列出具有部分 uuid 的对象的 S3 前缀

java - 需要帮助来杀死窗口进程,使用 selenium-webdriver

c# - 将 12 位 int 转换为 16 或 32 位

c++ - 使用 cout 和 cin 时, "<<"和 ">>"运算符在做什么,我们为什么要使用它们?