位运算
位运算就是把数字用二进制表示之后,对每一位上的0或者1的运算。
与(&) | 0&0=0 | 0&1=0 | 1&1=1 |
或(|) | 0|0=0 | 1|0=1 | 1|1=1 |
异或(^) | 1^0=1 | 0^1=1 | 1^1=0 |
题目14:二进制中1的个数
题目描述:
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
题目分析:
- 可能引起死循环的解法:将输入的数组进行移位,每次对移动的位和1做位与运算
- 常规解法:不右移输入的数字n,首先把n和1做与运算,判断n的最低位是不是为1,接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1,这样反复右移。
- 进阶解答:把一个整数的减去1,再和原整数做与运算,会把该整数最右边的1变成0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
代码实现:
package swordToOffer;
import java.util.Scanner;
public class Num14_NumberOfOne {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
System.out.println(NumberOfOne(n));
System.out.println(NumberOfOneRight(n));
System.out.println(NumberOfOneSubOne(n));
}
}
public static int NumberOfOneRight(int n) {
int count =0;
while(n!=0) {
if((n&1)!=0)
count++;
n=n>>1;
}
return count;
}
public static int NumberOfOne(int n) {
int count =0;
int flag=1;
while(flag!=0) {
if((n&flag)!=0)
count++;
flag=flag<<1;
}
return count;
}
public static int NumberOfOneSubOne(int n) {
int count = 0;
while(n!=0) {
++count;
n=(n-1)&n;
}
return count;
}
}
例题考点:
- 对二进制位运算的理解
- 分析解决问题的思路,例如输入负数,会进入死循环,因为负数右移还是负数
- 把一个数减去1,再和原来的整数做位运算,会把该整数最右边1变成0;