升序输出长度为5的01串(C++ bitset 用法)

升序输出长度为5的01串

题目描述:对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。

解法:

  1. 直接暴力:用五个for循环模拟输出即可;
  2. 数组模拟十进制转换二进制;
#include <bits/stdc++.h>
using namespace std;

int main(){
	
	int a[6];
	for(int i=0;i<32;i++){
		memset(a,0,sizeof(a));
		int num=i,z=0;
		while(num!=0){
			a[z++]=num%2;
			num/=2;
		}
		for(int j=4;j>=0;j--)
			printf("%d",a[j]);
		printf("\n");
	}
	return 0;
}
  1. 模拟二进制运算
#include<bits/stdc++.h>
using namespace std;

int main(){

    char a[6] = "00000";
    for(int i=0; i<32; i++){
        puts(a);
        a[4] += 1;
        for(int j=4; j>=0; j--){
            if(a[j]=='2'){
                a[j-1]+=1;
                a[j]='0';
            }
        }
    }
    return 0;
}
  1. 巧用 bitset
#include <bits/stdc++.h>
using namespace std;

int main(){

    bitset<5> b;
    for(int i = 0; i < 32; i++){
        b = i;
        cout<<b<<endl;
    }
    return 0;
}

C++ bitset 用法介绍

C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit 空间,相当于一个char元素所占空间的八分之一。。

具体用法:

常用构造函数有 4 种,如下:


    bitset<8> bitset1;     //无参构造,长度为8,默认每一位为0
    bitset<8> bitset(12);  //以整形数为参数,长度为8,二进制保存,前面用0补充

    string s = "100101";     //用string为参数,字符串只能包含 '0' 或 '1' 
    bitset<8> bitset3(s);  //长度为8,前面用0补充
    
    char s2[] = "10101";     //用char数组为参数,字符串只能包含 '0' 或 '1' 
    bitset<8> bitset4(s2);  //长度为8,前面用0补充

    cout << bitset1 << endl;  //00000000
    cout << bitset2 << endl;  //00001100
    cout << bitset3 << endl;  //00100101
    cout << bitset4 << endl;  //00010101
    

注意:

  • 构造时,需在<>中表明bitset 的大小(即size)。
  • 用字符串构造时,字符串只能包含 ‘0’ 或 ‘1’ ,否则会抛出异常。
  • 此外,可以通过 [ ] 访问元素(类似数组),注意最低位下标为0。
  • 在进行有参构造时:
    • 若参数的二进制表示比bitset的size小,则在前面用0补充;
    • 若比bitset的size大,参数为整数时取后面部分,参数为字符串时取前面部分

    bitset<2> b1(8);   // 8 的二进制为1000(长度为4),但 b1 的 size=2,只取后面部分,即00

    string s = "100111";  
    bitset<4> b2(s);   // s 的 size=6,而 b2 的 size = 4,只取前面部分,即 1001

    char s2[] = "111100";
    bitset<4> b3(s2);  // 与 b2 同理,只取前面部分,即1110

    cout << bitset1 << endl;  // 00
    cout << bitset2 << endl;  // 1001
    cout << bitset3 << endl;  // 1111
    

bitset的运算

bitset的运算就像一个普通的整数一样,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)、取反(~) 等操作。


    bitset<4> a (string("1001"));
    bitset<4> b (string("0011"));

    cout << (a ^= b) << endl;       // a = 1010 (a对b按位异或后赋值给a)
    cout << (a &= b) << endl;       // a = 0010 (按位与后赋值给a)
    cout << (a |= b) << endl;       // a = 0011 (按位或后赋值给a)
    cout << (a & b) << endl;        // 0011 (按位与,不赋值)
    cout << (a | b) << endl;        // 0011 (按位或,不赋值)
    cout << (a ^ b) << endl;        // 0000 (按位异或,不赋值)

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

    cout << (a == b) << endl;       // false (0110 == 0011为false)
    cout << (a != b) << endl;       // true  (0110 != 0011为true)

    cout << (~a) << endl;           // 1001 (按位取反)
    
注意:这份代码注释部分是每一步根据上一步的a,b的值进行运算的结果

bitset的相关函数

函数 作用
b.size() 返回大小(位数)
b.count() 返回 1 的个数
b.any() 返回是否有 1
b.none() 返回是否没有 1
b.set() 全都变成 1
b.set ( p ) 将第p + 1位变成 1
b.set(p, x) 将第p + 1位变成x
b.reset() 全都变成 0
b.reset ( p ) 将第p + 1位变成 0
b.flip() 全都取反
b.flip ( p ) 将第p + 1位取反
b.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
b.to_string() 返回它转换为string的结果
发布了26 篇原创文章 · 获赞 27 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览