190. Reverse Bits

例: 0011 --> 11000000000000000000000000000000,而不是简单的1100

如果不考虑位数的话就是一个二进制转成十进制的程序:

res = 0;
while (n > 0) {
    res = res * 2 + n % 2;
    n /= 2;
}
return res;

转换成位操作的话就是把里面的乘除模替换成一元运算符

输入n是一个无符号整数,取值范围在0~4294967295,用普通的int会溢出

java 8 中无符号整数和整数之间的转换:

String bs = "11111111111111111111111111111101";
int num = Integer.parseUnsignedInt(bs, 2);
System.out.println(Integer.toUnsignedString(num)); // 输出的是字符串

因为32位的二进制可能是整数溢出,然后还涉及到一个右移和除2的关系,它们会有区别是因为int溢出会变成负数

public int reverseBits(int n) {
    int res = 0;
    for (int i = 0; i < 32; i++) {
        res <<= 1; // 相当于*2
        if ((n & 1) == 1) res++;
        n >>= 1;
        // n /= 2; // 使用 test 11111111111111111111111111111101 的时候右移和除二结果是不一样的, 除2会比右移结果多1, 因为中间溢出变成负数
    }
    return res;
}

感觉蛮难的居然是easy

results matching ""

    No results matching ""