15 HJ15 求int型正整数在内存中存储时1的个数
知识点:位运算
描述
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例1
输入:
5
输出:
2
示例2
输入:
0
输出:
0
我的解法:
#include<bitset>
#include<iostream>
using namespace std;
int main(){
int num;
cin>>num;
string str;
while(num>0){
str+='0'+num%2;
num/=2;
}
int count=0;
for(int i=0;i<str.size();i++){
if(str[i]=='1'){
count++;
}
}
cout<<count;
return 0;
}
别人的解法:
#include<bitset>
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
bitset<32> b(n);
cout<<b.count();
}
知识点
bitset
bitset是c++的一个类库,其元素值只能为0或1,可用下标访问其元素或对元素赋值。bitset的每个元素仅占1bit空间。
定义bitset
使用bitset<> a语句。<>内为bitset的大小(长度),a为定义的bitset名。bitset可以通过构造方法进行初始化。
无参构造:bitset中所有元素均为0。
参数为整型构造:bitset中存储该整型参数的二进制串。例如:bitset<8> a(5) 输出a,显示 00000101。特别的,当参数的二进制串超过定义的bitset大小,则bitset会抛弃该参数二进制串的高位进行构造。
参数为字符串构造:bitset中存储该字符串,但该字符串必须为只包含'0'或'1'的01串。例如:bitset<8> a("1001") 输出a,显示00001001。特别的,当字符串长度超过定义的bitset大小,bitset会抛弃字符串的低位进行构造(右低左高)。
知识点拓展
二、基本操作
1.定义:
bitset< n > s;
表示一个n位的二进制数,<>中填写位数;
2.位运算操作符:
~s: 返回对s每一位取反后的结果;
&,|,^:返回对两个位数相同的bitset执行按位与、或、异或运算的结果;
<<, >>:返回把一个bitset左移,右移若干位的结果.(补零);
==,!=:比较两个位数相同的bitset代表的二进制数是否相等;
3.[ ]操作符:
s[k] :表示s的第k位,即可取值也可赋值,编号从0开始;
4.count:
s.count() 返回二进制串中有多少个1;
5.any/none
若s所有位都为0,则s.any()返回false,s.none()返回true;
若s至少有一位为1,则s.any()返回true,s.none()返回false;
6.set/rest/flip
s.set()把s所有位变为1;
s.set(k,v)把s的第k位改为v,即s[k]=v;
s.reset()把s的所有位变为0.
s.reset(k)把s的第k位改为0,即s[k]=0;
s.flip()把s所有位取反.即s=~s;
s.flip(k)把s的第k位取反,即s[k]^=1;
总结:两种解法各有优缺点,具体再分析吧。