面试题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
- 面试题10:二进制数中1的个数
- 面试题10:二进制数中1的个数
- 面试题---二进制中1的个数
- 面试题10:二进制中1的个数
- 面试题10:二进制中1的个数
- [剑指offer][面试题10]二进制中1的个数
- 《剑指offer》面试题10二进制中1的个数
- 【剑指offer】面试题10:二进制中1的个数
- 【剑指offer】面试题10:二进制中1的个数
- 剑指offer 面试题10 二进制中1的个数
- 剑指Offer:面试题10 二进制中1的个数
- 面试题10 二进制中1的个数
- 面试题10:二进制中1的个数
- 面试题10-二进制中1的个数
- 面试题10:二进制中1的个数
- 面试题10二进制中1的个数
- 《剑指Offer》面试题10:二进制中1的个数
- 剑指offer-面试题10-二进制中1的个数
- HDU 1372 Knight Moves (BFS)
- jquery多属性选择器
- HDU 1072不用标记的BFS
- Linux下使Shell 命令脱离终端在后台运行
- 出现xxxViewController respondsToSelector 原因
- 面试题10:二进制数中1的个数
- 【c/c++】break和continue
- Spring的split()函数引发的错误
- C++第4次实验
- 关于没有listener.ora文件,监听依然正常启动并使用的问题
- java.lang.NoClassDefFoundError: net/sf/json/JSONObject
- 嵌入式博客链接
- win10 sql server 2014 服务中需要设置失败后自动重启
- jQuery插件开发 学习笔记