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。