剑指offer 11二进制中1的个数

来源:互联网 发布:怎样修改网络密码 编辑:程序博客网 时间:2024/05/22 10:27

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
1.常规做法,由于要考虑到负数,所以不方便将给定的数字右移,因为如果n为负数,那么右移的话,左边的空缺会被填1,当然,如果n为正数,那么左边的空缺会被填0。所以我们可以先设置mark=1,通过左移mark来遍历n中的1的个数。
public class Solution {    public int NumberOf1(int n) {        if(n==0)return 0;        int number=0;        int mark=1;        while(mark!=0){            if((n&mark)!=0)number++;            mark=mark<<1;        }        return number;    }}


2.高效率的做法
根据n&(n-1)的性质来做,这种方式会删除掉最右边的1,而这个1左边的数字不变。
如果n&(n-1)之后这个数不为0,那么说明n就不会为0,那么n至少有一个1,而去掉的则是最右边的1。
public class Solution {    public int NumberOf1(int n) {        if(n==0)return 0;        int number=0;        while(n!=0){            number++;            n=n&(n-1);        }        return number;    }}


0 0
原创粉丝点击