二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。
例如,把 9 表示成二进制是 1001,有 2 位是 1。
因此,如果输入 9,则该函数输出 2。
示例 1:
输入:11
输出:3
解释:输入的二进制串 00000000000000000000000000001011中,共有三位为 ‘1’。
示例 2:
输入:128
输出:1
解释:输入的二进制串 00000000000000000000000010000000中,共有一位为 ‘1’。
示例 3:
输入:4294967293
输出:31
解释:输入的二进制串 11111111111111111111111111111101中,共有 31 位为 ‘1’。
#方法一
from collections import Counter
def int_Conter(n):
bin_n = bin(n)
dict_bin = Counter(bin_n)
for k, v in dict_bin.items():
if k == '1':
return v
print(int_Conter(11))
print(int_Conter(128))
print(int_Conter(4294967293))
#方法二
def int_count(n):
bin_n = bin(n)
num = str(bin_n).count('1')
return num
print(int_count(11))
print(int_count(128))
print(int_count(4294967293))
#方法三
def onecount2(nn):
countnum = 0
while nn:
print(nn, nn-1)
print(bin(nn))
print(bin(nn-1))
nn = nn & (nn - 1)
print("与运算结果:", bin(nn))
countnum += 1
return countnum
print("个数为:",onecount2(58))
关于方法三的理解
- 首先创建一个新的整数为原始整数68,二进制为1000100,减去1, 即为’1000011’.
- 将新创建的数字与原始数字进行按位与运算,即1000100 & 1000011 = 1000000,此时已经移除了最右边的1
- 将新得到的数字赋值给原始变量,判断是否为0, 不为0说明其中还有1, 再进行前两步的循环操作,每次循环计数器加1
- 循环结束时,变量为0,其中的1已经全部消除,此时的循环次数就是原始整数中1的个数
- 返回循环次数
| & | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
11的二进制为1011,10的二进制为1010,(11 & 10)的运算结果为1010,输出结果 10
已知11小于2的4次方,大于2的3次方,则11的二进制中1的个数小于等于4
将1011看做字符串s,s[4]=1,s[3]=0,s[2]=1,s[1]=1
每次的nn&(nn-1)都是在向前一位做运算,算这一位是0还是1
相对好理解的方法是,我们可以逆向来看运算结果
首先59的二进制的第六位(32)肯定是1,剩下27 1
27>16,所以第五位是1,剩下11 2
11>8,第四位是1,剩下3 3
4>3>2,第二位是1,剩下1 4
1=1,第一位是1 剩下0 5
上述代码只是变相运用了该过程