2017-04-03 3 views
-1

私はuint10と言うように2つのビットでuint8変数を拡張したいと考えています。そのために私はこの方法を使いましたが、考慮に入れるだけでマスクがかかります。uint8をC言語のunit2に分割してunit10を後で作成する

void splitbits(unsigned int x){ //x=11001010 and i want to have this for any given X 
    split[0]=(x>> 6) & 0x01 ; //split[0]=11 
    split[1]=(x>> 4) & 0x01 ; //split[1]=00 
    split[2]=(x>> 2) & 0x01 ; //split[2]=10 
    split[3]=x & 0x01 ; //split[3]=10 
} 
+5

あなたは 'split'配列の各要素での2ビットをしたい場合のカップルにバイトのバッファをsplitingためのいくつかのコードを、あなたの代わりに' 0x01'の '0x03'を使うべきではないのですか? – kuro

+0

こんにちはこれは、私たちがビットを知っているこのケースでのみ動作します。私はマスクなしでunkonwデータを分割するために探します。ビット単位の操作ではうまくいきません。 – samibe

+0

はい、ありがとう、0x01または0x02 2ビットのために私は間違っていた。 – samibe

答えて

1
split[0]=(x>> 6) & 0x01 ; //split[0]=11 

のコメントは事実正しくありません。 2つの最下位ビットではなく、最下位ビット以外のすべてをマスクします。バイナリ11でマスクする必要があります。これは10進数または16進数で3です。

split[0]=(x>> 6) & 0x03 ; //split[0]=11 
//     ^binary 11 

ただし、他の数字から10ビットの数字を作りたい場合は、すべてを1回で行うことができます。それは10ビットを含むことになる最小の携帯型であるため、すなわち

uint16_t my10Bit number = anotherNumber & 0x3ff // 3ff is 1111111111 in binary 

Iはuint16_tを用います。

+0

彼は正しいです、それは私が問題を説明しなかった、私は別の番号にそれを追加するためにこの番号を分割します。私は分割数を8にシフトし、10ビットの数字を持つために使用するか演算子を使うので、これは私が説明しなければならないことです。この演算には正しいと思います。 – samibe

0

ビット

unsigned char* splitcouplebits(unsigned char* buffer, int couplecount){ 
    unsigned char* v1 = (unsigned char*)malloc(couplecount); 
    for (int i = 0; i < couplecount; i++) { 
     int bn = i/4; 
     int offs = 3 + bn * 2 - i; 
     offs *= 2; 
     v1[i] = (buffer[bn] >> offs) & 0x03; 
    } 
    return v1; 
} 

//... main 
{ 
    unsigned char src[2]; 
    src[0] = 0xBB; 
    src[1] = 0x13; 
    //1011101100010011  
    unsigned char* splits = splitcouplebits((unsigned char*)&src, 8); 

    //first 5 couples of bits 
    cout << (int)splits[0] << endl; //10 
    cout << (int)splits[1] << endl; //11 
    cout << (int)splits[2] << endl; //10 
    cout << (int)splits[3] << endl; //11 
    cout << (int)splits[4] << endl; //00 
    //.... 

    delete splits; 
} 
関連する問題