C++_シリーズ独学コース_第_6_レッスン_bitsetセット_『C++Primer第四版』
17149 ワード
C言語で整数のあるビットを操作するには、多くのテクニックが必要です.この場合、C++で標準ライブラリで提供される抽象データ型
bitsetが改善されました.
一、標準ライブラリbitタイプ
1、bitsetの役割
bitsetはbitの集合と見なすことができ,集合のいずれかに単独でアクセスすることができ,アクセスの結果を論理的な判断の条件とすることができる.bitsetを使用する場合は可能です
これらのbitの格納方法にかかわらず、bitsetタイプで提供されるインタフェースのセットで動作します.
stringやvectorと同様にbitsetタイプを使用するには、以下に示すように準備する必要があります.
2、bitsetの定義
bitsetオブジェクトを定義する場合は、bitsetオブジェクトがどれだけのbitを格納するかを指定する必要があります.これは、bitsetの後ろの<>で設定することで、以下のようになります.
Exp:
bitset<16> b16Test;//16 bitのbitsetを格納するオブジェクトの定義
bitset<32> b32Test;//32 bitを格納するbitsetオブジェクトの定義
要点:
bitset bitObj; 定義するときnの値は、整数のフォント値または整数のフォント値で初期化されたconstオブジェクトでなければなりません.変数ではありません.
注意しなければなりません.
Exp:
実行結果は次のとおりです.
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オブジェクトの初期化
上記の初期化で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:
実行結果:
Exp:部分的stringの文字列でbitsetオブジェクトを初期化する
実行結果は次のとおりです.
この結果を説明します.
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<
実行結果は次のとおりです.
上記の例では、2つの特徴に特に注意が必要であることがわかります.
b.set(n)、b.reset(n)、b.flip(n); このnは0から計算され,最低位から計算される.
次の例を示します.
実行結果:
以上の結果から、bitsetの下付き操作は0からカウントされ、最低からカウントされる、すなわちbitObj[0]で表されるbitsetの最下位ビットである.
今回お話しするのは、次は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
注意しなければなりません.
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
bitset
bitset
bitset
要点:
符号なし数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.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言語に関する配列やポインタの内容ですが、続きは・・・