颠倒二进制[位运算]

文章介绍了两种方法来颠倒一个32位整数的二进制表示:一是直接逆序存储,二是使用分治策略。逆序存储通过遍历二进制位实现,而分治方法则通过不断右移并结合位运算高效地完成翻转。这两种方法展示了从基础到优化的思维过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

颠倒二进制,可以直接将二进制逆序存储,得到新的数;也可分治快速颠倒。

一、颠倒二进制

在这里插入图片描述

二、解

1、逆序存储

func reverseBits(num uint32) uint32 {
    var rs uint32 = 0
    for i := 0;i < 32;i++ {
        if (1 << i) & num != 0 {
            rs = rs | (1 << (31 - i))
        }
    }
    return rs
}

2、分治颠倒

// 基于分治不断翻转,也能做到全二进制翻转。
func reverseBits(num uint32) uint32 {
    num = (num >> 1) & m1 | (num & m1) << 1
    num = (num >> 2) & m2 | (num & m2) << 2
    num = (num >> 4) & m4 | (num & m4) << 4
    num = (num >> 8) & m8 | (num & m8) << 8
    num = num >> 16 | num << 16

    return num
}
const (
    m1 = 0x55555555 // 01010101...
    m2 = 0x33333333 // 00110011...
    m4 = 0x0f0f0f0f // 00001111...
    m8 = 0x00ff00ff // 0000000011111111 
    // 16位的就不用抹除了,比较左移/右移16位,剩余部分都是补上的0了。
)

总结

1)基于分治可快速处理,而且简洁。
2)从直接到巧秒,从基本到优化,不断成长。

参考文献

[1] LeetCode 颠倒二进制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值