bitset转二进制函数学习

转载出处

头文件:#include<bitset>

用法:把数字或者字符串转换成二进制的形式

详细细节:

	bitset<4> a(2);//把2转换成二进制,<4>表示4位,少的补0,多的截取前面的
	cout<<"a为"<<a<<endl; 
	for(int i=0;i<4;i++)
		cout<<a[i]<<" ";//顺序很有意思,从后往前的 ,截取也是这样 
	cout<<endl;
	
	string b0="10001";
	bitset<10> b(b0);
	bitset<10> b1(string("10001"));
	cout<<b<<endl;//输出也是按10位的

可用操作符:

    bitset<4> foo (string("1001"));
    bitset<4> bar (string("0011"));

    cout << (foo^=bar) << endl;       // 1010 (foo对bar按位异或后赋值给foo)
    cout << (foo&=bar) << endl;       // 0010 (按位与后赋值给foo)
    cout << (foo|=bar) << endl;       // 0011 (按位或后赋值给foo)

    cout << (foo<<=2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
    cout << (foo>>=1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)

    cout << (~bar) << endl;           // 1100 (按位取反)
    cout << (bar<<1) << endl;         // 0110 (左移,不赋值)
    cout << (bar>>1) << endl;         // 0001 (右移,不赋值)

    cout << (foo==bar) << endl;       // false (0110==0011为false)
    cout << (foo!=bar) << endl;       // true  (0110!=0011为true)

    cout << (foo&bar) << endl;        // 0010 (按位与,不赋值)
    cout << (foo|bar) << endl;        // 0111 (按位或,不赋值)
    cout << (foo^bar) << endl;        // 0101 (按位异或,不赋值)
	
    foo[0]=1;
    cout << foo[0] << endl;           //1

可用函数:

    bitset<8> foo (string("10011011"));

    cout << foo.count() << endl;//5  (count函数用来求bitset中1的位数,foo中共有5个1
    cout << foo.size() << endl; //8  (size函数用来求bitset的大小,一共有8位

    cout << foo.test(0) << endl;//true  (test函数用来查下标处的元素是0还是1,并返回false或            true,此处foo[0]为1,返回true
    cout << foo.test(2) << endl;//false  (同理,foo[2]为0,返回false

    cout << foo.any() << endl;//true  (any函数检查bitset中是否有1
    cout << foo.none() << endl;//false  (none函数检查bitset中是否没有1
    cout << foo.all() << endl;//false  (all函数检查bitset中是全部为1
	

补充说明一下:test函数会对下标越界作出检查,而通过 [ ] 访问元素却不会经过下标检查,所以,在两种方式通用的情况下,选择test函数更安全一些

    bitset<8> foo (string("10011011"));

    cout << foo.flip(2) << endl;//10011111  (flip函数传参数时,用于将参数位取反,本行代码将foo下标2处"反转",即0变1,1变0
    cout << foo.flip() << endl; //01100000  (flip函数不指定参数时,将bitset每一位全部取反

    cout << foo.set() << endl;//11111111  (set函数不指定参数时,将bitset的每一位全部置为1
    cout << foo.set(3,0) << endl;//11110111  (set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对foo的操作相当于foo[3]=0
    cout << foo.set(3) << endl; //11111111  (set函数只有一个参数时,将参数下标处置为1

    cout << foo.reset(4) << endl;//11101111  (reset函数传一个参数时将参数下标处置为0
    cout << foo.reset() << endl; //00000000  (reset函数不传参数时将bitset的每一位全部置为0return 0;
 

另外的转换函数:

    bitset<8> foo ("10011011");

    string s = foo.to_string();  //将bitset转换成string类型
    unsigned long a = foo.to_ulong();  //将bitset转换成unsigned long类型
    unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型

    cout << s << endl;  //10011011
    cout << a << endl;  //155
    cout << b << endl;  //155

补充:转载出处

任意进制转10进制函数

    char buffer[20]="1001221";  
    char *stop;  
    int ans=strtol(buffer, &stop, 2);   //将八进制数1054转成十进制,后面均为非法字符
    printf("%d\n",ans);  
    printf("%s\n", stop); 

10进制转其他进制

    int num = 100;  
    char str[100];  
    _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
    printf("%s\n", str);  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值