C++におけるビット毎アクセスの実現
私が起業したプロジェクトでは、ネットワーク帯域幅を節約するために、ネットワークでデータを伝送するにはコンパクトなアクセスが必要で、国防、科学研究、宇宙飛行、軍需産業など多くの分野でも同様の需要があります.
コンパクトなアクセスを実現し、1バイトずつアクセスするのではなく、ビットごとにアクセスします.例えば、1バイトでは、8つのbool情報を格納することができ、くだらないことは言わないで、直接コードを共有することができます(注釈:中のコードアルゴリズムは最適化に値します).
//以下、関数定義
//以下は関数実装
コンパクトなアクセスを実現し、1バイトずつアクセスするのではなく、ビットごとにアクセスします.例えば、1バイトでは、8つのbool情報を格納することができ、くだらないことは言わないで、直接コードを共有することができます(注釈:中のコードアルゴリズムは最適化に値します).
//以下、関数定義
-
-
- /***********************************************************************/
- /* : buffer */
- /* pBuffer[in]: buffer */
- /* nStart[in]: */
- /* nEnd[out]: */
- /* retByte[out]: */
- /* :void */
- /***********************************************************************/
- void ReadOneBit( byte* pBuffer, int nStart, /* out */int& nEnd, /* out */ byte& retByte );
-
- /***********************************************************************/
- /* : buffer */
- /* pBuffer[in]: buffer */
- /* nStart[in]: */
- /* btLength[in]: */
- /* nEnd[out]: */
- /* retData[out]: , */
- /* :void */
- /***********************************************************************/
- template<typename T>
- void ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, /* out */int& nEnd, /* out */ T& retData );
-
- /***********************************************************************/
- /* : buffer */
- /* pBuffer[in]: buffer */
- /* nStart[in]: */
- /* nCount[in]: */
- /* nEnd[out]: */
- /* pRetData[out]: */
- /* :void */
- /***********************************************************************/
- void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, /* out */int& nEnd, /* out */char* pRetData );
-
-
-
- /***********************************************************************/
- /* : buffer */
- /* pBuffer[in]: buffer */
- /* btData[in]: */
- /* nStart[in]: */
- /* nEnd[out]: */
- /* :void */
- /***********************************************************************/
- void WriteOneBit( byte* pBuffer, byte btData, int nStart, /* out */int& nEnd );
-
- /***********************************************************************/
- /* : buffer */
- /* pBuffer[in]: buffer */
- /* tData[in]: , */
- /* nStart[in]: */
- /* btLength[in]: */
- /* nEnd[out]: */
- /* :void */
- /***********************************************************************/
- template<typename T>
- void WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, /* out */int& nEnd );
-
- /***********************************************************************/
- /* : buffer */
- /* pBuffer[in]: buffer */
- /* pchar[in]: */
- /* nStart[in]: */
- /* nCount[in]: */
- /* nEnd[out]: */
- /* :void */
- /***********************************************************************/
- void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart, int nCount, /* out */int& nEnd );
//以下は関数実装
-
-
- void ReadOneBit( byte* pBuffer, int nStart, /* out */int& nEnd, /* out */ byte& retByte )
- {
- byte btData = pBuffer[nStart/8];
- btData = btData <
- retByte = btData >> 7;
- nEnd = nStart+1;
- }
-
- template<typename T>
- void ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, /* out */int& nEnd, /* out */ T& retData )
- {
- //
- retData = 0;
- if ( btLength > sizeof(T)*8 )
- return ;
-
- byte btData;
- T tData;
- while ( btLength-- )
- {
- ReadOneBit(pBuffer, nStart, nStart, btData);
- tData = btData <
- retData |= tData;
- }
-
- nEnd = nStart;
- }
-
- void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, /* out */int& nEnd, /* out */char* pRetData )
- {
- for ( int nIndex=0; nIndex
- {
- ReadDataFromBuffer(pBuffer, nStart, 8, nStart, pRetData[nIndex]);
- }
- nEnd = nStart;
- }
-
-
- void WriteOneBit( byte* pBuffer, byte btData, int nStart, /* out */int& nEnd )
- {
- int nSet = nStart / 8;
- byte c = pBuffer[nSet];
- switch ( btData )
- {
- case 1:
- c |= ( 1 <
- break;
- case 0:
- c &= ( ~(1 <
- break;
- default:
- return;
- }
- pBuffer [nSet] = c;
- nEnd = nStart +1;
- }
-
-
-
- template<typename T>
- void WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, /* out */int& nEnd )
- {
- /* //
- byte btDataLength = sizeof(T);
- if ( btLength > sizeof(T)*8 )
- return;
-
- int nDataStart = 0; // 0,
- while ( btLength-- )
- {
- byte bitData;
- ReadOneBit((byte*)&tData, nDataStart, nDataStart, bitData);
- WriteOneBit(pBuffer, bitData, nStart, nStart);
- }
-
- nEnd = nStart;
- */
-
- // : buffer ,
-
- //
- byte btDataLength = sizeof(T);
-
- //
- if ( btLength > sizeof(T)*8 )
- return;
-
- // byte*
- byte* ptData = (byte*)&tData;
-
- //
- int nSet = btLength / 8;
- int nRin = btLength % 8;
-
- //
- byte bitData;
- byte byteData;
- int nTempEnd;
-
- // rin
- byteData = ptData[nSet];
- while ( nRin-- )
- {
- ReadOneBit(&byteData, 7-nRin, nTempEnd, bitData);
- WriteOneBit(pBuffer, bitData, nStart, nStart);
- }
-
- // Set
- while ( nSet )
- {
- byteData = ptData[--nSet];
- // byte
- int i=0;
- while ( i!=8 )
- {
- ReadOneBit(&byteData, i++, nTempEnd, bitData);
- WriteOneBit(pBuffer, bitData, nStart, nStart);
- }
- }
- nEnd = nStart;
-
- }
-
-
- void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart, int nCount, /* out */int& nEnd )
- {
- for ( int nIndex=0; nIndex
- {
- WriteDataToBuffer(pBuffer, pchar[nIndex], nStart, 8, nStart);
- }
- nEnd = nStart;
- }