剑指offer--10.二进制中1的个数

题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数,eg,9表示为二进制是1001,有2位是1,则输入9,函数返回2

分析:

思路一:先判断整数二进制表示中最右边一位是不是1,接着把输入的整数右移一位,判断最右边是否为1,这样每次移动一位,直到整个整数变为0为止

注意:整数右移一位和把整数除以2在数学上是等价的,但是代码中不能将右移运算换成除以2,因为除法的效率比移位运算要低的多

public static int number(int n){
		int count=0;
		while(n!=0){
			if((n&1)==1){
				count++;
			}
//			n=n>>1;是负数时会陷入死循环
			n=n>>>1;//无符号右移
		}
		return count;
	}

思路二:把一个整数减1,都是将最右边1变成0,如果它右边还有0,则所有0变为1且左边保持不变。接下来把一个整数和它减去1的结果做位与运算,相当于把它最右边的1变为0.eg:1100减去1位1011,然后1100和1011与得到1000,正是将1100最右边的1变为0的结果。所以总结就是,把一个整数减1,再和原来整数做与运算,会把该整数最右边一个1变为0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作

public static int numberOfOne(int n){
		int count=0;
		while(n!=0){
			count++;
			n=n&(n-1);
		}
		return count;
	}

举一反三,相关题目:

1.用一条语句判断一个整数是否是2的整数次方

分析:一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位时0.所以把这个整数减去1之后再和它自己作与运算,这个整数中唯一的1就会变为0

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

分析:eg,10二进制为1010,13二进制为1101,可见需要改变后三位,即求不一样的个数,即可以先求这两个数的异或,再统计异或记过中1的位数

猜你喜欢

转载自blog.csdn.net/autumn03/article/details/80108241