您的位置:首页 > 职场人生

码农小汪-剑指Offer之9 - 二进制中1的个数 算数右移 逻辑左移

2016-03-31 10:14 411 查看

题目描述

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

解题思路:

刚开始想法是,不断的进行右移进行与1与运算的话,我们的题目就可以解决了这个问题!

但是我们的负数的时候,进行右移位算术右移,不断的补1 这样会造成我们的判断错误!

进行我们的左移动的话不用考虑这些问题,我们不移动我们原来的数字,反之移动我们的比较的数字向左移动,这样比较简单的解决了问题

左移这种事情特别的快,通过我们的cpu的基本寄存器解决问题,如果做乘除法,速度慢了一大截。

代码

package JianzhiOffer;

/**
*
* @author JetWang
*
*/

public class Slution9 {
/**
* @param n
* @return
*/
public int NumberOf1(int n) {
/**
* 如果是负数的话,我们不断的右移动,会造成我们通过算数移动,不断的增加1,这个1的数量就是 无穷大的,正数的话没有问题的
*/
int count = 0;
while (n != 0) {
if ((n & 1) == 1) {
count++;
}
n = n >> 1;
}
return count;
}

public int NumberOf2(int n) {
/**
* 这次我们通过向右移动我们作为比较的数字 1101 & 1 = 1 1101 & 10 = 0 1101 & 100 =1
* 这样的情况就不会出现刚才那种样子啦 只要比较的结果不是0,我们的位数自然的加一 对于我们的flag
* 要移动多少次,对于Int来说的话最多32次 过了就会溢出为0
*/
int count = 0;
int flag = 1;
while (0 != flag) {
if ((flag & n) != 0) {
count++;
}
flag = flag << 1;
}
return count;
}

public static void main(String[] args) {
System.out.println(new Slution9().NumberOf2(7));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: