【C】190 颠倒二进制位

文章介绍了如何在Java等语言中颠倒32位无符号整数的二进制位,提供了两种方法:解法一通过逐位操作,时间复杂度和空间复杂度均为O(1);解法二利用位运算优化,虽然操作更复杂但速度更快。

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

提示:

请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。

解法一

#include <stdint.h>

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

从给定的 32 位无符号整数 n 的最低位开始,逐位取出并存放到结果 res 的最高位,然后 n 向右移动一位,res 向左移动一位,直到 n 的所有位都取完

时间复杂度分析

原始算法中,我们需要遍历给定的 32 位无符号整数的所有位,进行逐位的颠倒操作。
由于只有固定的 32 位,因此遍历的时间复杂度为 O(32),即 O(1)。

空间复杂度分析

原始算法并没有使用额外的空间,只使用了几个整型变量来保存中间结果,因此空间复杂度为 O(1)。

解法二

#include <stdint.h>

uint32_t reverseBits(uint32_t n) {
    n = (n >> 16) | (n << 16);
    n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8);
    n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4);
    n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2);
    n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1);
    return n;
}

通过位运算来同时颠倒相邻的位

时间复杂度分析

优化后的算法通过位运算来同时颠倒相邻的位,而不是逐位进行操作。
通过多次使用位移和按位与运算,将原始的 32 位整数颠倒。
优化后算法的时间复杂度取决于位运算的时间复杂度,位运算的时间复杂度通常为 O(1)。
空间复杂度分析

优化后算法仍然只使用了几个整型变量来保存中间结果,因此空间复杂度也为 O(1)。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_shsf

来包瓜子嘛,谢谢客官~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值