声明用的python语言
第一题: 颠倒二进制位
输入: 32为无符号二进制数如000010111(这里就只写这几位)
输出: 111010000
- 方法一:移位+拼接
def reverseBits(n):
result = ''
# 32位所以循环32次
for i in range(32):
end = n & 1 # 这里其实是在求二进制n的最后一位
'''
n & 0000 0000 0000 0000 0000 0000 0000 0001
这里注意前面的 0 & 任意数 = 0
而 1 & 任意数 = 这个任意数
所以最后结果就是n的最后一位
'''
result += str(end)
n >>= 1
'''
这里其实等同与 n = n >> 1, >> 是对二进制数向右移动高位补0, 移动丢
低位
'''
return int(result, 2)
- 方法二:字符串反转遍历
def reverseBits(n):
return int(bin(n)[2: ].zfill(32)[: :-1], 2)
'''
基本原理是得到二进制n的字符类型然后反转
'''
第二题
这题在我有第一题的基础上我终于独立的完成了, 结果去看官解,我又是一口盐呛死自己
题目:统计二进制中位为1的总数
输入: 00001010111
输出: 5(上面二进制中有5个1)
- 方法一
def hammingWeight(n):
count = 0 # 用来统计1的个数
while(n):
count += 1 if (n & 1) else 0
n >>= 1
return count
'''
与第一题类似
每次得到最后一位进行判断
循环移位
'''
- 方法二
def hammingWeight(n):
count = 0
while(n):
count += 1
n &= n - 1
'''
n &= n -1才是最秀的
考虑末尾为1
假设n: 1000101, n-1: 1000100
n &= n -1后n: 1000100消去了1, 并count++以此类推
考虑末尾为0
n: 1000100, n-1: 1000011
n &= n-1后n: 1000000消去了1, 并count++以此类推
# print("这可真是秀儿")
'''