位运算习题

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法(1)
分析:要判断一个二进制中1的个数,我们可以用数字1去与需要做判断的数字a进行与运算;
,
如果a的第一位是0,那么与出来的结果一定是0,如果是1,则与出来的结果一定是1 ,其余位不管是多少,与出来的结果都一定是0;
接着每与一次,都进行一次左移运算,继续与a相与;
在这里插入图片描述
继续左移,重复上述操作,因为有32次所以要进行32次探测;
用一个计数器记录相与结果为1的次数;
这样就找出二进制中1的个数了。

public class Test3 {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int a = s.nextInt();
		int t = 1;
		int count = 0;
		for(int i = 0;i < 32;i++) {
			if((a & t) != 0) {
				count++;
			}
			t = t << 1;
		}
		System.out.println(count);
	}

}

方法(2)
分析:
假设有一个二进制数为011,
将它减1,得到010,010与011进行与运算:010 & 011 = 010;
010减1得到001,001与010进行与运算:001 & 010 =000;
可以发现循环两次之后二进制数变为了000;而二进制数刚好有两个1。
再比如:
有一个二进制数1110;
将它减1得到1101,1101与1110进行与运算:1101 & 1110 = 1100;
再将1100减1得到1011,1011与1100进行与运算:1011 & 1100 = 1000;
再将1000减1得到0111,0111与1000进行与运算:1000 & 0111 = 0000;
可以发现循环三次之后二进制数全部变为了0,而二进制数刚好有三个1
由上述规律我们可以发现n与(n - 1)每进行一次与运算都能去掉一个1;
所以可以用一个计数器记录1个个数。

import java.util.Scanner;
public class Task {
	public static void main(String[] args) {
		int count = 0;
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		while(n != 0) {
			count++;
			n = n & (n - 1);
		}
		System.out.println(count);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44084434/article/details/90112943
今日推荐