题目:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路:

很明显,这道题考察的是位运算。

1、依次将整数右移,判断整数最后一位是否为1(&1);

问题:如果该整数为负数,则会陷入无限循环,为什么?因为负数右移的时候,左边补1,整数右移过程中不可能为0,因此会陷入无限循环。

补码的移位:

左移,无论正数负数都在右边补0;

右移,正数在左边补0,负数在左边补1;

int NumberOf1(int n){
int count=0;
while(n){
if(n&1)
count++;
n=n>>1;
}
return count;
}

2、依次将1左移i位,然后跟该整数做与&操作,如果结果不为0,则第i位为1;

问题:整数有多少位,就得循环多少次。

3、利用小技巧

x&(x-1)可以将整数最右边的1变成0,通过这个小技巧,我们只要循环判断n=n&(n-1)是否为0,即可统计1的个数。

整数中有多少个1,则循环多少次。

4、位运算相关题目

  • 用一条语句判断一个整数是不是2的整数次方。

if(n&(n-1)==0) return true;

  • 输入两个整数m,n,计算需要改变m的二进制表示中的多少位才能得到n?

int x=m^n; return NumberOf1(x);  

代码:

#include <iostream>

using namespace std;

int NumberOf1_shift(int n){
int count=0;
unsigned int flag=1;
while(flag){
if(n&flag)
count++;
flag=flag<<1;
}
return count;
} int NumberOf1_fast(int n){
int count=0;
while(n){
count++;
n=n&(n-1);
}
return count;
} int main()
{
cout <<NumberOf1_shift(-8)<< endl;
cout <<NumberOf1_fast(-8)<< endl;
return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/8ee967e43c2c4ec193b040ea7fbb10b8?rp=1

AC代码:

class Solution {
public:
int NumberOf1(int n) {
int count=0;
while(n){
count++;
n=n&(n-1);
}
return count;
}
};

  

(剑指Offer)面试题10:二进制中1的个数的更多相关文章

  1. 剑指Offer - 九度1513 - 二进制中1的个数

    剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...

  2. 【剑指Offer】11、二进制中1的个数

      题目描述:   输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   解题思路:   本题有以下两个解决方案:   (1)依次判断每一位.判断的方法是先与1相与,为1则说明该位为1 ...

  3. 剑指offer 11. 位运算 二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数     private stat ...

  4. 剑指offer(11)二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目分析 首先我们要了解计算机中负数使用补码表示的,原码.补码的概念以及原理可以参考这里,这个题目我们应该从二进制入手,值得 ...

  5. 剑指offer【12】- 二进制中1的个数

    输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. public class Solution { public int NumberOf1(int n) { String str = ...

  6. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  7. 剑指offer-面试题10:二进制中1的个数

    题目:请实现一个函数,输入一个函数,输出该数二进制表示中1的个数.例如把9 表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 这道题最典型的方法就是用移位统计,就比如统计9的二进制1 ...

  8. 《剑指offer》面试题10 二进制中1的个数 Java版

    书中方法一:对于每一位,用1求与,如果为1表明该位为1.一共要进行32次,int4字节32位. public int check(int a){ int result = 0; int judge = ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  10. 剑指offer——面试题15:二进制中 1的个数

    // 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...

随机推荐

  1. 在phpWeChat中生成公众号 jssdk 各个参数(PHP)

    <?php //jsapipara $jsapipara=array(); $jsapipara['appid']=WECHAT_APPID; $jsapipara['noncestr']=cr ...

  2. String 字符串补0

    method1: 前提是你的长度已经确定!比如规定现实10位! - 优点: 不需要都是数字类型    String str_m =  "123X";  String str =&q ...

  3. java面试题一

    个人的一点参考总结,如有雷同,纯属巧合! 1.hashmap的实现原理以及hashtable的线程安全是怎么实现的?HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线 ...

  4. UESTC 1330 柱爷与远古法阵【高斯消元】

    题目链接[http://acm.uestc.edu.cn/#/problem/show/1330] 题意:有一个长度为L(L <= 300)的长廊,有一人站在最左边,他要到最右边去,他每次可以走 ...

  5. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  6. 【SDOI2017】树点染色【线段树+LCT】

    本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...

  7. 【递推】hdu5927 Auxiliary Set

    题意:给你一棵树.q次询问,每次给你一些非关键点,其他的点都是关键点,让你输出树中既不是关键点,也不是关键点的lca的点的数量. 对每次询问的非关键点按照深度从深到浅排序,依次处理,最开始每个点受到的 ...

  8. php uncode 转汉字编码

    $test = "%u4E0A%u6D77%u9EC4%u6D66";//$test = '\u5e86\u91cd\u5e86'; //庆重庆$temp = explode('% ...

  9. java开发_mysql中获取数据库表描述_源码下载

    功能描述: 在mysql数据库中,有两张表: data_element_config , test_table 我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_el ...

  10. slf4j使用

    pom jar包引用<!-- Logging --> <dependency> <groupId>ch.qos.logback</groupId> &l ...