![算法训练营:提高篇(全彩版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/130/52921130/b_52921130.jpg)
1.3.1 定义和初始化
1.定义位图
在定义位图时,需要在尖括号内给出它的位数。“bitset<32> bitvec;”表示定义bitvec为32位的位图对象,其位序自右向左为0~31。下面列出了位图的几种定义方式:
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_16.jpg?sign=1739252696-63vBam1BYyYErrfmTF55lyDPxqannMjz-0-0d731afedfe37b2a32eb01c72a0f5a07)
2.用unsigned值初始化位图对象
当将unsigned long值作为位图对象的初始值时,该值将被转换为二进制位模式,而位图对象中的位集将作为这种位模式的副本。若位图的二进制位数大于unsigned long值的二进制位数,则将其余高位设置为0;若位图的二进制位数小于unsigned long值的二进制位数,则只用unsigned long值中的低位,丢弃超过位图的二进制位的高位。在有32位unsigned long值的机器上,十六进制值0xffff被表示为二进制位就是16个1和16个0(每个0xf都可被表示为1111)。可以用0xffff初始化位图对象:
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_17.jpg?sign=1739252696-0jlmcUGmwy9WmwdXrTNGXko0kiTNNROs-0-9badbfc9a54ef9c7c49ba1f9d2359948)
在上面的3个例子中,第0~15位都被设置为1。由于bitvec1的二进制位数小于unsigned long值的二进制位数,因此bitvec1初始值的高位被丢弃。bitvec2与unsigned long值的二进制位数相同,因此所有位正好都被设置为初始值。因为bitvec3的二进制位数大于32,所以31位以上的高位都被设置为0。
输出位图对象:
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_18.jpg?sign=1739252696-AdKhScm1g7dZTMcp3IOcTeleq5HpeTta-0-20e2d0b7ccb3ef24766563b07e62af49)
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_19.jpg?sign=1739252696-8jhhdZ8rKmg36JChskcjryrxx7aABvpc-0-c7a9131f11f5c01acba2d2acb07d9719)
3.用string对象初始化位图对象
当用string对象初始化位图对象时,string对象直接被表示为二进制位模式。若string对象的字符数小于位图对象的二进制位数,则位图对象的高位将被设置为0。
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_20.jpg?sign=1739252696-Ve2FxCMxsiG8WN7fOPairhjOinkBXbPf-0-63c7597b0008e9fc9f7fa5d6cff3f197)
注意 string对象的最右边字符用于初始化位图对象的低位。
![](https://epubservercos.yuewen.com/AE123A/31457654304331706/epubprivate/OEBPS/Images/txt001_21.jpg?sign=1739252696-tfUyxI4TKtI27XwPprc60EYVvotw8LO3-0-c1a47997926a188a284e8ca451ba7649)
bitvec5(str, 5, 4)表示从str[5]开始取4个字符初始化bitvec5。若省略第3个参数,则表示取从开始位置一直到string对象末尾的所有字符。