二进制中1的个数
来源:互联网 发布:gifcam mac版下载 编辑:程序博客网 时间:2024/06/06 02:54
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
位运算基础:
- 左移操作:
m<<n 表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。如:00001010<<2=00101000 ,10001010<<3=01010000 . - 右移操作:最右边n位被丢弃
- 无符号数:用0填补最左边的n位
- 有符号数:用数字的符号位填补最左边的n位
- 例子:
00001010>>2=00000010 ,10001010>>3=11110001 。
思路一:先判断最右边是不是1,然后右移一位,依次循环。但当是负数时会进入死循环。
思路二:将n和1做与运算,判断n的最低位是不是1。接着把1左移一位得到2,再和n做与运算,能判断n的次低位是不是1。
int NumberOf1(int n){ int count = 0; unsigned int flag = 1; while (flag){ if (n & flag){ count ++; } flag = flag << 1; } return count;}
思路三:把一个整数减去1,会把最右边的1变成0,若它右边还有0的话,所有的0都变成1,而它左边所有位都保持不变。把一个整数和它减去1的结果做位与运算,相当于把最右边的1变成0。
int NumberOf1(int n){ int count = 0; while (n){ ++count; n = (n - 1) & n; } return count;}
测试用例:
- 整数(包括边界值1、0x7FFFFFFF)
- 负数(包括边界值0x80000000、0xFFFFFFFF)
- 0.
相关题目:
- 用一条语句判断一个整数是不是2的整数次方
- 一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0。把这个整数减去1之后再和它自己做与运算,这个整数中唯一的1会变成0。
- 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
- 求这两个数的异或,再统计异或结果中1的位数
相关技巧:把一个整数减去1之后再和原来的整数做位于运算,得到的结果相当于把整数的二进制表示中的最右边一个1变成0。
0 0
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 黑马程序员-集合篇(2)
- HDU 5112 2014ICPC北京站现场赛 A Curious Matt
- Xcode 插件安装不成功的
- 马士兵_JAVA自学之路
- Sqoop中文手册
- 二进制中1的个数
- Eclipse 打开出现Failed to create the java Virtual Machine解决
- Sublime Text 3 LESS、SASS、SCSS高亮插件、提示插件
- 物料移动(MIGO/MB01等)更新物料凭证信息出口(user exit)
- 使用点斜式求两直线的交点
- path,classPath,java_home
- TCP/UDP部分理解
- Hash算法
- 常见的音频文件介绍