190.颠倒二进制位
解题思路:
1.逐位颠倒
二进制颠倒(位运算操作)
package leadcode;
/**
* @author : icehill
* @description : 颠倒二进制位
* 颠倒给定的 32 位无符号整数的二进制位。
* 方法1:逐位颠倒
* 将 n 视作一个长为 32 的二进制串,从低位往高位枚举 n 的每一位,将其倒序添加到翻转结果 rev 中。
* 代码实现中,每枚举一位就将 n 右移一位,这样当前 n 的最低位就是我们要枚举的比特位。当 n 为 0 时即可结束循环。
* 需要注意的是,在某些语言(如 Java)中,没有无符号整数类型,因此对 n 的右移操作应使用逻辑右移。
* 时间复杂度:O(logn) 空间复杂度:O(1)。
* @date : 2021-05-02
*/
public class Solution190 {
public static void main(String[] args) {
Solution190 solution190 = new Solution190();
System.out.println(solution190.reverseBits(1));
}
public int reverseBits(int n) {
int rev = 0;
for (int i = 0; i < 32; i++) {
//每次把rev左移一位,并加上n&1(注意java运算符优先级【+、-】>【位运算:& ^ |】>【+= -=】)
rev <<= 1;
rev += n & 1;
//n右移一位
n >>= 1;
}
return rev;
}
public int reverseBitsTwo(int n) {
int rev = 0;
for (int i = 0; i < 32 && n != 0; i++) {
//每次取n的最低位,然后左移到31-i,就是对应要反转的位置,然后或上rev存放起来
rev |= (n & 1) << (31 - i);
//n右移一位
n >>= 1;
}
return rev;
}
}