首页 > 代码库 > 《剑指Offer》题目——位运算

《剑指Offer》题目——位运算

题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

题目分析:无论使用什么方式,最关键的就是要考虑负数的处理方式

public class NumberOfOne {
    //方法一: 最优解
    public static int numberOfOnes(int n){
        int count =0 ;
        while (n!=0){
            n = n & (n-1);
            count++;
        }
        return count;
    }
    //方法二:考虑一下Java对应的数据类型的移位处理规则
    public static int numberOfOnes1(int n){
        int count = 0;
        int flag = 1;
        while (flag!=0 ){
            if ((n & flag) !=0 ){
                ++count;
            }
            flag = flag << 1;
        }
        return count;
    }
    public static void main(String[] args){
//        System.out.println(numberOfOnes(-3));
        System.out.println(numberOfOnes1(-2));

    }
}

扩展一下:

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

答:判断这个整数的二进制表示的1的个数是不是1个即可。

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

答:分两步:1)求这两个数的异或,2)统计异或结果中1的个数

 

《剑指Offer》题目——位运算