前言
颠倒二进制,可以直接将二进制逆序存储,得到新的数;也可分治快速颠倒。
一、颠倒二进制
二、解
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 颠倒二进制