剑指Offer系列---(13)二进制中1的个数

来源:互联网 发布:淘宝广告报价 编辑:程序博客网 时间:2024/05/21 12:44

1.题目描述:
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
2.分析:
1)把一个整数减去1,都是把最右边的1变成0.如果它的右边还有0的话,所有的0都变成1,而它左边所有位都保持不变。
2)把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
3.源代码:

//  Copyright (c) 2015年 skewrain. All rights reserved.#include <iostream>#include <stdio.h>using namespace std;int NumberOf1(int n){    int count = 0;    while (n)    {        ++count;        n = (n-1)&n;    }    return count;}int main(int argc,char *argv[]){    int n;    cout<<"请输入一个整数:";    cin>>n;    cout<<"数字"<<n<<"的二进制中含有1的个数为:"<<NumberOf1(n)<<endl;    return 0;}

4.相关知识点:
位运算一共只有5种与、或、异或、左移和右移。
左移运算符m<<n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。
右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边位的情形要稍微复杂一点。如果数字是一个无符号数值,则用0填补最左边的n位。如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。也就是说如果数字原先是一个正数,则右移之后在最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。


0 0