Leetcode 190 题 颠倒二进制位

题目描述

颠倒给定的 32 位无符号整数的二进制位。

示例:
输入:00000010100101000001111010011100
输出:00111001011110000010100101000000
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。


思路分析

1、对二进制数进行翻转,类似于整数翻转,需要先获得二进制数的末位。可以通过与运算实现(1 & n)。

我们知道,1&0=0;1&1=1,因此 0 或 1 与 1 相与,都等于本身。若要求 n 的末位二进制位值,只需将 n 和 1 做与运算。

下图所示求5的最后一个二进制位值
在这里插入图片描述
类似的求最后两位二进制值需要将 n 和 3 做与运算。
在这里插入图片描述
2、获取末位值后,需要获得倒数第二位数值,这里通过移位即可实现:n>>1,使倒数第二位移至末位。我们只需位移 32 次,就能获得 n 的所有二进制位值。

3、使用 result 对各个二进制位进行保存。

使用 Java 进行代码描述:

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

「一个小细节」

由于1 & n的值为 0 或者 1,所以返回结果 result 直接加上(1 & n)以更新最后一位数值。
这里也可以使用或运算。参与或运算的两个元素,只要有一个为1,那么结果就为1,否则为0。

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

技术公众号:小猿君的算法笔记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值