问题
计算机内部的所有值均以二进制表示。 在这个简单的任务中,您将编写一个程序,该程序计算给定值中非零位数。
我们使用的是32位整数值,因此应该有0到32个非零位。
请注意,与大多数语言不同,Python假装数字是无限长的(尽管某些可用于其他语言的方法可能无法按预期工作,但这不会阻止您解决此任务)。
例如:
value binary count
1 00000000000000000000000000000001 1
100 00000000000000000000000001100100 3
-1 11111111111111111111111111111111 32
输入数据将包含许多要处理的值。
下一行将包含值本身,每个值的范围是-2 000 000 000 … 2 000 000 000。
答案应包含每个值设置为1的位数,以空格分隔。
例:
input data:
3
1 100 -1
answer:
1 3 32
代码
在这里其实就是计算数字的32位补码中1的个数,关键难点在与负数如何修改成32位
def intToBin32(i):
return (bin(((1 << 32) - 1) & i)[2:]).rjust(32)
num=input()
list_input=list(map(int,input().split()))
result=[]
for i in list_input:
bin_num=intToBin32(i)
count=0
for j in range(32):
if bin_num[j]=="1":
count+=1
result.append(count)
print(*result)
方法二是看了给的提示做的,将负数直接修改成补码然后运算
def count_bits(x):
c=0
for i in range(32):
c += (x & 1)
x >>= 1
return c
num=input()
list_input=list(map(int,input().split()))
result=[]
count=0
for i in list_input:
if i<0:
i=2**32+i
count=count_bits(i)
else:
count=count_bits(i)
result.append(count)
print(*result)