C++_シリーズ独学コース_第_6_レッスン_bitsetセット_『C++Primer第四版』

17149 ワード

C言語で整数のあるビットを操作するには、多くのテクニックが必要です.この場合、C++で標準ライブラリで提供される抽象データ型
bitsetが改善されました.
 
一、標準ライブラリbitタイプ
1、bitsetの役割
bitsetはbitの集合と見なすことができ,集合のいずれかに単独でアクセスすることができ,アクセスの結果を論理的な判断の条件とすることができる.bitsetを使用する場合は可能です
これらのbitの格納方法にかかわらず、bitsetタイプで提供されるインタフェースのセットで動作します.
stringやvectorと同様にbitsetタイプを使用するには、以下に示すように準備する必要があります.
#include <bitset>     //        
#using std::bitset;   //              

 
2、bitsetの定義
bitsetオブジェクトを定義する場合は、bitsetオブジェクトがどれだけのbitを格納するかを指定する必要があります.これは、bitsetの後ろの<>で設定することで、以下のようになります.
bitset<n>  bitTset;  //    bitset  bitTest, n        bit   

Exp:
  bitset<16>  b16Test;//16 bitのbitsetを格納するオブジェクトの定義
  bitset<32>  b32Test;//32 bitを格納するbitsetオブジェクトの定義
要点:
  bitset  bitObj; 定義するときnの値は、整数のフォント値または整数のフォント値で初期化されたconstオブジェクトでなければなりません.変数ではありません.
注意しなければなりません.
Exp:
int main()
{
    bitset<5> bitObj(5);

    cout<<bitObj<<endl;

    return 0;
}

実行結果は次のとおりです.
[root@localhost cpp_src]# g++ test.cpp 
[root@localhost cpp_src]# ./a.out 
00101

 
3、bitsetクラスの初期化
bitsetは、以下に示すように、いくつかの初期化方法を提供します.
  bitset  bitsetObj1;//bitsetオブジェクトbitsetObj 1を初期化するすべてのbitは0です.
  bitset  bitsetObj2(u);//符号なし整数uでbitsetオブジェクトbitsetObj 2を初期化する.
     bitset  bitsetObj3(string);//stringオブジェクトを利用してbitsetオブジェクトbitsetObj 3を初期化する.
  bitset  bitsetObj4(string, pos, m);//stringオブジェクトによるposビットからのmビットの初期化
要点:
符号なし数uとstringオブジェクトで初期化する場合、長さが一致しない場合があります.またstringオブジェクトは0、1からなる文字シーケンスです.
シンボル数なしで初期化する場合は、まずシンボル数なしをバイナリフォーマットに変換してbitsetオブジェクトに格納します.stringオブジェクトで初期化するときもstringを先に
オブジェクトはバイナリフォーマットに変換され、bitsetオブジェクトに格納されます.
Exp:bitsetオブジェクトの初期化
int main()
{
    string str="111110101101";
    bitset<16> bitObj1;         //16 bit  0
    bitset<32> bitObj2(0xffff); //32 bit,  16bit   0,  16bit  1
    bitset<8>  bitObj3(str);    //           

    cout<<sizeof(0xffff)<<endl;

    return 0;
}

上記の初期化でstringオブジェクトの初期化に注意する必要がある場合、文字列の文字面値で初期化することはできません.
次の場合:
    string  str="1111_1010_1101";//これを利用して区切りはより良い表示のためです
    bitset<8> bitObj3(str);
    bitset<32> bitObj4(str);
このように初期化されたbitObj 3のbitの格納の結果は、11111010; 
bitObj 4の結果は以下の通りである:00000000000000000000001111101101
法則がわかります.stringオブジェクトの長さがbitsetオブジェクトの容量より大きい場合、stringの後半は切断され、stringオブジェクトの下付きスケールは相対的に小さくなります.
を選択します.
stringオブジェクトの長さがbitsetオブジェクトの容量より小さい場合、stringオブジェクトをすべて変換し、stringオブジェクトをbitsetオブジェクトの
下位部分、残りのビットセットが不足している高位部分は0で揃えます.
Exp:
int main()
{
    string str="111110101101";
    bitset<16> bitObj1;
    bitset<32> bitObj2(0xffff);
    bitset<8>  bitObj3(str);
    bitset<32> bitObj4(str);

    cout<<bitObj3<<endl;
    cout<<bitObj4<<endl;
    cout<<sizeof(0xffff)<<endl;

    return 0;
}

実行結果:
[root@localhost cpp_src]# g++ bitset_init.cpp 
[root@localhost cpp_src]# ./a.out 
11111010
00000000000000000000111110101101
4

 
Exp:部分的stringの文字列でbitsetオブジェクトを初期化する
int main()
{
    string str="1111111000000011001101";
    bitset<32> bitObj1(str,5,4);
    bitset<32> bitObj2(str,str.size()-4);

    cout<<bitObj1<<endl;
    cout<<bitObj2<<endl;
    cout<<str.size()<<endl;

    return 0;
}

実行結果は次のとおりです.
[root@localhost cpp_src]# ./a.out 
00000000000000000000000000001100
00000000000000000000000000001101
22

この結果を説明します.
  string str("11_1111_1000_0000_1100_1101") ;//
  bitset<32>  bitObj1(str, 5, 4); この初期化はstrオブジェクトのstr[5]から4文字を取ってbitobj 1オブジェクトを初期化することを意味する.取り出したから
文字長は32 bit未満であるため、前述したstring長がbitsetオブジェクト長より小さい付与方法に従う.
     bitset<32>  bitObj2(str, str.size() - 4); ここでは2つのパラメータしかありませんが、最後のパラメータはありません.str.size()-4から文字シーケンスを取り、ずっと字を取ります.
stringオブジェクトの最後の文字に符号を付けて変換し、変換プロセスはstringオブジェクトとbitsetオブジェクトの長さに関する前述の付与規則に従います.
そのため、上記の運転結果が得られました.
実は後の2種類の初期化は主にどのように文字のシーケンスを取るかに注意しなければならなくて、文字のシーケンスが取り出した後に、取り出した文字のシーケンスを1つの新しいstringオブジェクトとして初期化します
化すればいい.
  
4、bitsetクラスが提供する操作
他の標準ライブラリクラスと同様にbitsetも多くの操作を提供しています.主に以下のようなものがあります.
   bitset  bitObj;
  bitObj.any( ); ビットObjオブジェクトに既に1に設定されたビットが存在するか否かを返す
  bitObj.none(); 戻りビットObjは1のバイナリビットが存在しないか、すべてのビットが0であり、すべてが0であるかどうかをテストするときにtrueを返す
  bitObj.count(); ビットObjの1のビット数を返します
  bitObj.size(); ビットObjオブジェクトのビット数を返します
  bitObj[pos] ; bitobjのpos位置にあるバイナリbitの値を返します
  bitObj.set(); 1に設定します.
  bitObj.set(pos); posでのbitを1に設定します.
  bitObj.reset(); 設定はすべて0です.
  bitObj.reset(pos); pos位置を0に設定
  bitObj.flip(); すべてのbitは逆を取ります;
  bitObj.flip(pos); pos位置のbitを逆にします.
  bitObj.to_ulong()bitObjをunsigned long intタイプに変換
     os< 
int main()
{
    bitset<5> bitObj(5);

    cout<<bitObj<<endl;
    cout<<"The size of bitObj is:"<<bitObj.size()<<endl;
    cout<<"bitObj.to_ulong() is:"<<bitObj.to_ulong()<<endl;

    cout<<"bitObj[3] is:"<<bitObj[3]<<endl;

    if(bitObj.any())
        cout<<"bitObj has some bit == 1"<<endl;
    else
        cout<<"bitObj has no bit == 1"<<endl;

    if(bitObj.none())
        cout<<"bitObj all bit is 0."<<endl;
    else
        cout<<"bitObj has some bit == 1"<<endl;

    bitObj.set();
    cout<<"after bit.set() bitObj is:"<<bitObj<<endl;
    bitObj.reset(3);
    cout<<"after bit.reset(3),the bitObj is:"<<bitObj<<endl;
    
    bitObj.reset();
    cout<<"after bitObj.reset() bitObj is:"<<bitObj<<endl;
    bitObj.set(4);
    cout<<"after bitObj.set(4),bitObj is:"<<bitObj<<endl;


    cout<<"bitObj.flip() is:"<<bitObj.flip()<<endl;

    cout<<"bitObj is"<<bitObj<<endl;
    bitObj.flip(1);
    cout<<"after bitObj.flip(1),bitObj is:"<<bitObj<<endl;


    return 0;
}

実行結果は次のとおりです.
[root@localhost cpp_src]# ./a.out 
00101
The size of bitObj is:5
bitObj.to_ulong() is:5
bitObj[3] is:0
bitObj has some bit == 1
bitObj has some bit == 1
after bit.set() bitObj is:11111
after bit.reset(3),the bitObj is:10111
after bitObj.reset() bitObj is:00000
after bitObj.set(4),bitObj is:10000
bitObj.flip() is:01111
bitObj is01111
after bitObj.flip(1),bitObj is:01101
[root@localhost cpp_src]# 

上記の例では、2つの特徴に特に注意が必要であることがわかります.
   b.set(n)、b.reset(n)、b.flip(n); このnは0から計算され,最低位から計算される.
次の例を示します.
int main()
{
    bitset<5> bitObj(12);

    cout<<bitObj<<endl;
    cout<<bitObj[0]<<endl;
    cout<<bitObj[1]<<endl;
    cout<<bitObj[2]<<endl;
    cout<<bitObj[3]<<endl;
    cout<<bitObj[4]<<endl;

    return 0;
}

実行結果:
[root@localhost cpp_src]# g++ test.cpp 
[root@localhost cpp_src]# ./a.out 
01100
0
0
1
1
0

以上の結果から、bitsetの下付き操作は0からカウントされ、最低からカウントされる、すなわちbitObj[0]で表されるbitsetの最下位ビットである.
 
 
今回お話しするのは、次はC言語に関する配列やポインタの内容ですが、続きは・・・