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

相关题目:
1)用一条语句判断一个整数是不是2的整数次方。一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0,,根据前面的分析,把这个整数减去1之后再和它自己做与运算,这个整数中唯一的1就会变成0.
2)输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010中的3位才能得到1101。我们可以分为两位解决这个问题:第一步求这两个数的异或,第二步统计异或结果中1的位数。
 
思路一:
不建议右移输入的数字n,而是把n和1做与运算,判断n的最低位是不是为1。接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1.......这样反复左移,每次都能判断n的其中一位是不是1.
思路二:
把一个整数减去1,都是把最右边的1变成0,。如果它的右边还有0的话,所有的0都变成1,而它左边所有位都保持不变。接下来我们把一个整数和它减去1的结果做位运算,相当于把它最右边的1变成0.还是以前面的1100为例,它减去1的结果是1011.我们再把1100和1011做位与运算,得到的结果是1000。我们把1100最右边的1变成了0,结果刚好就是1000。
总的来说就是:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
 
测试用例:
1)整数(包括边界值1、0x7FFFFFFF)
2)负数(包括边界值0x80000000、0xFFFFFFFF)
3)0
 
代码实现:
package com.yyq;

/**
* Created by Administrator on 2015/9/11.
*/
public class NumberOfInBinary {
public static int NumberOf_1(int n){
int count = 0;
int flag = 1;
while(flag != 0){
if((n & flag )!= 0)
count++;
flag = flag << 1;
}
return count;
} public static int NumberOf_2(int n){
int count = 0;
while(n != 0){
++count;
n = n & (n-1);
}
return count;
} //=========测试用例============
public static void Test(int number, int expected)
{
int actual = NumberOf_1(number);
if(actual == expected)
System.out.println("Solution1: Test for " + number + " passed!");
else
System.out.println("Solution1: Test for " + number + " fail!"); actual = NumberOf_2(number);
if(actual == expected)
System.out.println("Solution2: Test for " + number + " passed!");
else
System.out.println("Solution2: Test for " + number + " fail!"); System.out.println();
} public static void main(String[] args){
// 输入0,期待的输出是0
Test(0, 0); // 输入1,期待的输出是1
Test(1, 1); // 输入10,期待的输出是2
Test(10, 2); // 输入0x7FFFFFFF,期待的输出是31
Test(0x7FFFFFFF, 31); // 输入0xFFFFFFFF(负数),期待的输出是32
Test(0xFFFFFFFF, 32); // 输入0x80000000(负数),期待的输出是1
Test(0x80000000, 1); }
}
 
输出结果:
Solution1: Test for 0 passed!
Solution2: Test for 0 passed!
 
Solution1: Test for 1 passed!
Solution2: Test for 1 passed!
 
Solution1: Test for 10 passed!
Solution2: Test for 10 passed!
 
Solution1: Test for 2147483647 passed!
Solution2: Test for 2147483647 passed!
 
Solution1: Test for -1 passed!
Solution2: Test for -1 passed!
 
Solution1: Test for -2147483648 passed!
Solution2: Test for -2147483648 passed!
 
 
 

P78、面试题10:二进制中1的个数的更多相关文章

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

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

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

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

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

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

  4. 《剑指offer》面试题15. 二进制中1的个数

    问题描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:00000 ...

  5. 《剑指offer》第十五题(二进制中1的个数)

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

  6. 剑指Offer面试题:9.二进制中1的个数

    一.题目:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二.可能引起死循环的解法 一个 ...

  7. 基于visual Studio2013解决面试题之0410计算二进制中1的个数

     题目

  8. 剑指Offer面试题:8.二进制中1的个数

    一 题目:二进制中1的个数 题目:请实现一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二 可能引起死循环的解法 // 计算整数的二 ...

  9. VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)

    1. 求数组中的和为0 的一对数的数量 注意,需要用到set import java.util.Scanner; public class Main{ public static void main( ...

  10. 【Java】 剑指offer(14) 二进制中1的个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把 ...

随机推荐

  1. C 再识数组指针 指针数组的概念

    参考出处: http://www.cnblogs.com/mq0036/p/3382732.html http://www.cnblogs.com/hongcha717/archive/2010/10 ...

  2. poj 2154 Color

    这是道标准的数论优化的polya题.卡时卡的很紧,需要用int才能过.程序中一定要注意控制不爆int!!!我因为爆intWA了好久=_=…… 题目简洁明了,就是求 sigma n^gcd(i,n):但 ...

  3. C++中执行windows指令

    执行windows指令: BOOL ExecDosCmd(]) { SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength = sizeof(S ...

  4. 真正的inotify+rsync实时同步 彻底告别同步慢

    真正的inotify+rsync实时同步 彻底告别同步慢       http://www.ttlsa.com/web/let-infotify-rsync-fast/     背景 我们公司在用in ...

  5. 滑动选择日期(基于sui-mobile的移动端)

    $(page).on('touchmove','#touchMoveTime',function (event) { touchMove(event); }); scrollBarInit(); // ...

  6. Sharing

    To store English words, one method is to use linked lists and store a word letter by letter. To save ...

  7. 第二章 约束和排序数据(SQL基础)

    第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息:                注意:使用 between 下边界 and 上边界时,条件包括边界值: ...

  8. Mysql 如何删除数据表中的重复数据!

    1.使用distinct查询所有不重复的记录 2.创建数据表相同结构的临时表,将第一步的数据复制进去 create temporary table if not exists student_temp ...

  9. PDF合并

    要求:将多个table导出到一个PDF里,然后打印. 问题分析:要求将四个table放一个PDF打印,四个table的列各不相同,第一个是表头,其他三个是列表,列比表头多很多,如果直接生成一个exce ...

  10. 【多路复用】I/O多路复用

    http://www.tuicool.com/articles/RBvqUz C#下用select方法实现socket服务端