位运算-二进制中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); } }
也曾想仗剑走天涯,后来因为Bug多就没去……