2017-02-13 9 views
1

バイナリの値が11111111であるバイトがあります。これらのルールに従って、バイトを011010101010101に16ビット拡張する必要があります。ビット= 1の場合は01、ビット= 0の場合は10です。どのようにビットをマスクできますか?

例:

00001111 -> 1010101001010101 
00000101 -> 1010101010011001 

これはどのような操作ですか?

+0

なぜ16ビットマスクでバイトをマスキングしていますか?バイトエンティティを16ビットワードにキャスティングする予定ですか? –

+0

バイト(通常は今の日)は8ビットしか正しくないことに気付きました。どのようにバイトを増やす予定ですか? –

答えて

0

私は、記述されているようにビットを "展開"する演算子があるとは思わない。 しかし、あなたが一緒にシフトすると、次のようにビットをテストしてループ内でそれを行うことができます:

unsigned char b = 0xff; 
unsigned int result = 0x0; 

for (int i=0; i<8; i++) { 
    result <<= 2; // make place for the next 2 bits 

    int isSet = b & 0x80; // check highest significant bit of b 
    if (isSet) { 
     result |= 0x01; // in bits: 01 
    } 
    else { 
     result |= 0x02; // in bits: 10 
    } 

    b <<= 1; 
} 

はそれがお役に立てば幸いです。

+0

それだけです! Thankss –

+0

あなたは大歓迎です。あなたの問題を解決した場合、答えを受け入れることを忘れないでください。 –

1

まず、intにあなたのバイトを変換する:

int x = (int)byte_value; 

そして、次に、シフトとビット単位で各ビットを倍増、1次に、2次に、一度にビット4をシフトすることにより、16ビットに伸びますOR:次に

x = ((x << 4) | x) & 0b0000111100001111; 
x = ((x << 2) | x) & 0b0011001100110011; 
x = ((x << 1) | x) & 0b0101010101010101; 
x = (x << 1) | x; 

、ビットが1であり、ビット0(使用してビット単位NOT)である場合、奇数位置が1であれば偶数ビット位置が1になるようにビットをマスク:

x = (x & 0b0101010101010101) | (~x & 0b1010101010101010); 
+0

注意:byte_valueがsigned charなら、intへの変換は符号拡張を行い、1以外のすべてのビットに1を代入することがあります。 –

関連する問題