颠倒二进制位
注意,输入的是个十进制数如 826588,不是二进制字符串如 0001001001111。
思路一:
将二进制字符串反转,再计算对应的十进制数值
func reverseBits(num uint32) uint32 {
str := fmt.Sprintf("%032b", num)
slice := []rune(str)
//把字符串转换为十进制数,如果遍历,刚好不用逆序。。
var result float64 = 0
for index, item := range slice {
result += float64(item-'0') * math.Pow(2, float64(index))
}
return uint32(result)
}
注意,如果用strconv.FormatUint 需要手动添加前导 0
func reverseBits(num uint32) uint32 {
//str := fmt.Sprintf("%032b", num)
str := strconv.FormatUint(uint64(num), 2)
// 添加前导零以确保长度为32位
for len(str) < 32 {
str = "0" + str
}
slice := []rune(str)
//把字符串转换为十进制数,如果遍历,刚好不用逆序。。
var result float64 = 0
for index, item := range slice {
result += float64(item-'0') * math.Pow(2, float64(index))
}
return uint32(result)
}
思路二:
位运算
重新定义一个uint32类型的result,初始为0,提取原数的最低位,原数右移一位使得最低位变化。拿到最低位后补充到result最低位,result左移一位,为新的最低位腾出空间
func reverseBits(num uint32) uint32 {
var result uint32 = 0
for i := 0; i < 32; i++ {
result = (result << 1) | (num & 1)
num >>= 1
}
return result
}