翻转一个数的比特位

翻转一个数的比特位

问题

给定32位无符号整数的反位。

输入:00000010100101000001111010011100

输出:00111001011110000010100101000000

说明:输入的二进制字符串00000010100101000001111010011100表示无符号整数43261596,因此返回964176192,其二进制表示为00111001011110000010100101000000

代码

public int reverseBits(int n) {
    int ret = 0;
    for (int i = 0; i < 32; i++) {
        ret <<= 1;
        ret |= (n & 1);
        n >>>= 1;
    }
    return ret;
}

如果该函数需要被调用很多次,可以将 int 拆成 4 个 byte,然后缓存 byte 对应的比特位翻转,最后再拼接起来。

private static Map<Byte, Integer> cache = new HashMap<>();

public int reverseBits(int n) {
    int ret = 0;
    for (int i = 0; i < 4; i++) {
        ret <<= 8;
        ret |= reverseByte((byte) (n & 0b11111111));
        n >>= 8;
    }
    return ret;
}

private int reverseByte(byte b) {
    if (cache.containsKey(b)) return cache.get(b);
    int ret = 0;
    byte t = b;
    for (int i = 0; i < 8; i++) {
        ret <<= 1;
        ret |= t & 1;
        t >>= 1;
    }
    cache.put(b, ret);
    return ret;
}

  转载请注明: ForwardXu 翻转一个数的比特位

 上一篇
统计从 0 ~ n 每个数的二进制表示中1的个数 统计从 0 ~ n 每个数的二进制表示中1的个数
统计从 0 ~ n 每个数的二进制表示中1的个数问题 给定一个非负整数num。每一个数字我范围在0≤≤num计算1的二进制表示的数量和返回一个数组。 Input: 5 Output: [0,1,1,2,1,2] 代码 对于数字 6(110)
2019-01-05
下一篇 
找出数组中缺失的那个数 找出数组中缺失的那个数
找出数组中缺失的那个数问题 这个题目说的是,数组元素在 0-n 之间,但是有一个数是缺失的,要求找到这个缺失的数。 Input: [3,0,1] Output: 2 代码 两个相同的数异或的结果为 0,对所有数进行异或操作,最后的结果就是单
2019-01-05
  目录