func reverseBits(num uint32) uint32 { var res uint32 = 0 for i := 0; i < 32; i++ { // 新数字左移1位 res <<= 1 // num & 1是获取num的最后一位,也可以判断奇偶 // 最后一位加1,用或也可以,因为res最后一位肯定是0 res |= num & 1 // 右移1位,更新num num >>= 1 } return res }
// 16位互相交换 func reverseBits(num uint32) uint32 { var res uint32 = 0 for i := 0; i < 16; i++ { res |= (num & (1 << i)) << (31 - 2 * i) } for i := 16; i < 32; i++ { res |= (num & (1 << i)) >> (2 * i -31) } return res }
// 非dp算法 func countBits(num int) []int { res := make([]int, num+1) for i := 1; i <= num; i++ { cur := i for cur != 0 { cur &= cur - 1 res[i]++ } } return res }
// 高有效位 func countBits(num int) []int { dp := make([]int, num+1) hb := 0 for i := 1; i <= num; i++ { // 如果是2的幂,则更新高有效位 if i & (i - 1) == 0 { hb = i } // 高有效位的下一位是+1,以此类推,直到下一个2的幂,并更新 dp[i] = dp[i - hb] + 1 } return dp }
// 奇偶数,等于去掉最后一位前面的值 加上新的一位,是奇数就是1,偶数就是0 func countBits(num int) []int { dp := make([]int, num+1) for i := 1; i <= num; i++ { dp[i] = dp[i >> 1] + i & 1 } return dp }