【剑指offer】面试题15:二进制中1的个数【C++版本】

总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】

题目:

请实现一个函数,输入是一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此,如果输入9,则该函数输出为2。

解题思路:

1.不对数据进行移位,而是移位和数据进行与操作的1。因为移位数据可能会因为符号位而造成死循环
2.O(1)的解法。使用公式

n = ( n 1 ) & a m p ; a m p ; n ;
n减去1再和自身进行与操作(&)可以消除一个1。例如10表示成二进制是1010,10减1等于9表示成二进制是1001,两者想与得到1000,和1010比起来正好消去了最低位的1。在把消除为0的过程中这种操作的次数即是1个数。

扩展题目:

1.用一条语句判断一个整数是不是2的整数次方。
思路:2的整数次方的二进制表达中只有一个
2.输入两个整数m和n,计算需要改变m的二进制表达式中的多少位才能够得到n(即n和m有多少位不相同)异或之后求的个数。

总结:

1.位运算总共5种运算:与、或、异或、左移和右移
2.对于左移:左边的丢弃,右边补零,而对于右移:右边的丢弃,如果无符号,左边补零;如果是有符号,左边补符号位
3.尽量使用移位操作来代替2的整数次方的乘除法,使用位与运算来判断一个数的奇偶性(n&0X1)


可以AC的代码【C++版本】

#include <vector>                       
#include <iostream>
#include <string>

using namespace std;

int NumberOf1(int n)
{
    int resu = 0;
    //n没减到0就一直循环
    while(n != 0){
        resu++;
        //
        n = (n-1)&n;
    }

    return resu;
}

int main()
{
    int n;
    while(cin >> n){
        cout << NumberOf1(n) << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37950361/article/details/80669880
今日推荐