颠倒二进制位

11 阅读1分钟

颠倒二进制位

注意,输入的是个十进制数如 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
}