c++中,二进制与十进制互相转换代码以及bitset的使用
十进制转二进制
辗转相除,除2取余,结果倒着取
//十进制化为二进制
int ts(int n)
{int s=0,j=1;
while(n)
{
s=s+j*(n%2);
n/=2;
j=j*10;
}
return s;
}
二进制转为十进制
//二进制转化为十进制
int kt(int n)
{
int s=0;
stringstream ss;
ss<<n;
string str=ss.str();
for(int i=0;i<sq.length();i++)
{
s*=2;
s+=str[i]-'0';
}
return s;
}
bitset类的使用
bitset相当于一个只包含0、1的二进制数组。
头文件
#include< bitset >
用法
1、定义申明
bitset<4> a; //定义长度为4的bitset变量a,默认a为全0,即a=0000;
bitset<8> b(12); //定义长度为8的bitset变量b,括号中数12为要转化的十进制数
cout<<"b="<<b<<endl; //结果 b=00001100;(12的二进制数为1100,扩充到长度8,前面位补0,0000 1100)
string str="10110
bitset<8> c(str); //将二进制组成的字符串赋值给变量c,长度为8
cout<<str<<endl; //00010110
注意!
1、用字符串构造时,字符串只能包含0、1
2、当给变量赋了长度时,若长度大于转换后的二进制位数,则在前面补0;若长度【2】不够,当参数为整数【1011】时取后面部分【11】;参数为字符串【“1011”】时取前面部分【10】
3、访问bitset时可用[ ]访问它的每一位
string s=“abcd”; s[0]=a;
int p[5]={0,1,2,3,4}; p[0]=0;
与字符串,数组的顺序【下标 从左往右 依次从0增大】不同;
bitset< 4 > a(10); //a=1010; a[0]=0; a[3]=1;
下标0从其最低位开始 【即从右往左,从后向前 依次从0增大】
相关函数
bitset<8> s("10011011");
s.count(); //5 返回s中1的个数,s中有5个
s.size(); //8 返回s的位数,s为8位
s.test(0); //true 检查下标为0的元素(最低位)是0还是1,0返回flase,1返回true
s.any(); //true 检查s中是否有1
s.none(); //flase 检查s中是否没有1
s.all(); //flase 检查s中是否全为1
s.flip(); //01100100 不传参则将s的每一位取反
s.flip(2); //10011111 传参则将s的下标为2处取反
s.set(); //11111111 不传参则将s的每一位 置1
s.set(3); //10011011 传一个参数将s的下标为3的位 置1
s.set(3,0); //10010011 传两个参数将s的下标为3的位 置0(第二个参数)
s.reset(); //00000000 不传参则将s的每一位 置0
s.reset(3); //10010011 传参则将s的下标为3的位 置0
常用
s.set(); 将变量s各位全置1,得到全1串
s.reset(); 将变量各位全置为0,得到全0串
s.size(); 返回变量s的位数
c.count(); 返回变量s中1的个数
s.flip(); 将变量s的每一位取反
转换函数
bitset<8> t("10011011");
string s = t.to_string(); //将t转换成string型
unsigned long a = t.to_ulong(); //将t转换成unsigned long型
unsigned long long b = t.to_ullong(); //将t转换成unsigned long long型