第二十八题(整数的二进制表示中1的个数)
2014-06-22 17:26
127 查看
28.整数的二进制表示中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。
例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
这道题的另外一个变种是:求两个整数二进制表示形式中有多少个位上的数据不同。其实对这两个整数进行异或运算就可以转换成本题,最终还是求一个异或得到的整数二进制表示形式中1的个数。
这里提供两种思路
1:直接计数
考虑到输入的整数可能为负数,直接对其进行向右移位操作时,会将最高位符号位移入到低位,所以采用(1<<i)&number这种方法。
2.number&= number-1
这是一种很经典的位运算计较,可以将number中最低位的1变为0,重复执行该运算直到number为零,执行该运算的次数即为number中1的个数。
在整数中1个数较少的情况下,比思路1中循环计数的方法效率要很高。
代码:
题目:输入一个整数,求该整数的二进制表达中有多少个1。
例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
这道题的另外一个变种是:求两个整数二进制表示形式中有多少个位上的数据不同。其实对这两个整数进行异或运算就可以转换成本题,最终还是求一个异或得到的整数二进制表示形式中1的个数。
这里提供两种思路
1:直接计数
考虑到输入的整数可能为负数,直接对其进行向右移位操作时,会将最高位符号位移入到低位,所以采用(1<<i)&number这种方法。
2.number&= number-1
这是一种很经典的位运算计较,可以将number中最低位的1变为0,重复执行该运算直到number为零,执行该运算的次数即为number中1的个数。
在整数中1个数较少的情况下,比思路1中循环计数的方法效率要很高。
代码:
#include "stdafx.h" #include<iostream> using namespace std; namespace MS100P_28 { int countOnesOfIntiger1(int number) { int bits = 8*sizeof(int); int count = 0; for (int i = 0; i < bits;i++) if ((1 << i)&number) count++; return count; } int countOnesOfIntiger2(int number) { int count=0; while (number != 0) { number = number&(number - 1); count++; } return count; } void test() { int n = -6; cout << countOnesOfIntiger1(n) << endl; cout << countOnesOfIntiger2(n) << endl; } } int _tmain(int argc, _TCHAR* argv[]) { MS100P_28::test(); return 0; }
相关文章推荐
- 整数的二进制表示中1的个数 【微软面试100题 第二十八题】
- 【100题】第二十八 整数的二进制表示中1的个数
- 整数的二进制表示中1的个数 【微软面试100题 第二十八题】
- 微软算法100题28 整数的二进制表示中1 的个数
- 正整数的 二进制表示 中 从低位向高位 第1个0/1出现位置 的计算方法
- C语言 统计整数二进制表示中1的个数
- 正整数的二进制表示有多少个1
- 将一个整数的二进制表示的奇数位与偶数位交换位置
- 算法习题28:整数的二进制表示中1的个数
- 计算机内部整数的表示(二进制存储)
- 微软100题(28)整数的二进制表示中1的个数
- 整数二进制表示中1的个数[算法]
- 整数的二进制表示中1的个数
- 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]
- 整数A和B的二进制表示中有多少位是不同的
- 输入一个整数a,再输入两个整数p1ip2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位i
- 整数的二进制表示中有多少个1
- 两个小程序:atoi & 统计整数的二进制表示里有几个1
- 整数的二进制表示中 1 的个数
- 求一个32位整数的二进制表示形式