面试题10:二进制数中1的个数

来源:互联网 发布:鞋子 知乎 编辑:程序博客网 时间:2024/06/05 18:41

这是一个比较经典的位运算问题,我们先回顾一下什么是位运算:

左移运算

左移运算符m<<n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0:

00001010<<2 = 00101000

10001010<<3 = 01010000


右移运算

右移运算符m>>n表示将m右移n位。右移n位的时候最右边的n位将被丢弃,但右移时处理的最左边位要稍微复杂一点:

m为无符号数值

用0填补最左边的n位,00001010>>2 = 00000010

m为有符号数值,比如负数

用1填补最左边的n个位,10001010>>3 = 11110001


负数的二进制表示

这块确实忘了,在这里记录一下:正数5的二进制数原码是:00000000 00000000 00000000 00000101。正数取反的规则是,将原码->反码->补码,也就是说想要求-5的二进制,先取反码:11111111 11111111 11111111 11111010。补码是反码+1也就是:11111111 11111111 11111111 11111011,这就是-5了


解题思路

逐个比较这32位中每个数位是不是1就行了,那我们就设置一个flag=00000000 00000000 00000000 00000001,进行与运算看结果是不是1就知道最后一位是不是1了,如果是的话count+1,flag左移一位=00000000 00000000 00000000 00000010,再原数的有变第二位是不是1....以此类推循环32次就行了


源码

#coding:utf-8# 二进制数中1的个数def NumberOf1(n): # 输入一个十进制数,输出这个数二进制数中1的个数    flag = 1; count = 0    while flag <= 2**31-1: # 由于python能表示大数,因此设置一下传统int型的数值上限        if n & flag:            count += 1        flag = flag << 1    return countn = int(raw_input('请输入十进制数,我会输出这个十进制数的二进制数中1的个数:'))print NumberOf1(n)


0 0