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

Posted VictorWei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指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》题目——位运算的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer.二进制中1的个数(位运算)

剑指offer位运算56 - I. 数组中数字出现的次数

剑指offer位运算56 - I. 数组中数字出现的次数

剑指offer系列50--不用加减乘除做加法

剑指offer

剑指offer-面试题65-不用加减乘除做加法-位运算