位运算-二进制中1的个数

&(与)运算特点:

定义:参加运算的两个数据,按二进制位进行“与”运算。

运算规则:

0&0=0  0&1=0  1&0=0  1&1=1

总结:两位同时为1,结果才为1,否则结果为0

例如:3&5 即 0000 0011& 0000 0101 = 0000 0001,因此 3&5 的值得1。

注意:负数按补码形式参加按位与运算。

 

与:都为1结果为1

 

 

题目

请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。列:9的二进制表示为1001,有2位是1

 

解题思路

这里的题目有三种解法,先从最基本的说 探测某一位是否为1,先拿1从左到右运算,整数无非就是32位,所以这里的思路就是32位循环,每一次将1移动到相应的位置上,和二进制数进行 &(与) 运算。

 

看图解法一

假设我们设N为整数, 1向左进行位运算可得一下计算公式:

(N&(1<<i))==(1<<i)

 

 

解法二

  如下公式:

((N>>>i)&1)==1

 

 

解法三

如下公式:
N=((N-1)&N)





代码实现:
import java.util.Scanner;

public class three{
//题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。列:9的二进制表示为1001,有2位是1
    public static void main(String args[]){
        //java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        //创建Integer对象,并通过toString()方法获取到整数N的二进制无符号整数形式;
        System.out.println(Integer.toString(N,2));

        //用count初始化作为计算1的次数
        int count = 0;
        //解法一
        //比对每一位
        for(int i = 0;i < 32;i++){
            if ((N&(1<<i))==(1<<i)){
                count++;
            }
        }
        System.out.println(count);

        //解法二
        count = 0;
        for (int i = 0;i<32;i++){
            if (((N>>>i)&1)==1){
                count++;
            }
        }
        System.out.println(count);

        //解法三
        count=0;
        while(N!=0){
            N=((N-1)&N);
            count++;
        }
        System.out.println(count);
}

}

 



posted @ 2020-04-19 16:16  暮日温柔  阅读(...)  评论(...编辑  收藏