2012-01-02 6 views
2

可能性の重複:
Explanation of an algorithm to set, clear and test a single bit個々のビットを使って作業するには?

私はunsigned charを持っています。私は最初の3ビットとして別のunsigned charにコピーされた2から4までのビット(0として最下位ビットから数えて)を持っていたいと思います。例えば、

abcdefgh // a,b,c,d,e,f,g,h are 0 or 1 

に私が働くが、

output = (input << 3) 
output >>= 5; 

が仕事をしていません

unsigned char input, output; 
output = (input << 3) >> 5; 

を試してみました

00000def 

になります。

Cでこれを1行で実行する方法はありますか?

+1

この質問には多くの重複があります。上にリンクされたものは、単一のビットを必要とする特殊なケースですが、簡単に一般化します。 –

+0

'input << 3'は' unsigned char'ではなく 'int'なので動作しません。入力が<< 3) >> 5; 'が働いています – pmg

+0

@pmgまたは' output =((unsigned int))入力<< 3) >> 5; 'ビットシフトは符号なしオペランドで行われます – ouah

答えて

8

シフトは、その後、残りの部分をマスクオフ:

output = (input >> 2) & 0x07; 
+4

マスクは0x07であるべきです – ouah

+0

ありがとうございました。 – rsaxvc

0

はこれを試してみてください:

unsigned char input, output; 
input = 0x12abcdef; 
output = ((input & 0x00fff000) >> 3) & 0x00000fff; 

私はあなただけで同じライン上を前後にシフトし、毎回をとることができるとは思いませんあなたはスペースがゼロで埋められてシフトしますが、これはコンパイラに依存する可能性があります。これを行うと、正しいことが保証されます。

私は、「最初の3ビット」とは、3つの最下位ビットを意味しています。これは、リトルエンディアンシステムの左端または最初の3ビットです。

+0

コンパイラはこのビットエンディアンを抽象化しています。LSBは右に、MSBは中バイトエンディアンのハードウェアでさえもあります。 – rsaxvc

+0

これは次のように最適化されています:output = 0;入力は8ビットのucharで、0x00fff000でマスクすると0になります。>> 3まだゼロです。&0x00000fffはまだゼロです。 – rsaxvc

2

これは、必要なビットだけを取得してから、右にシフトします。 @rsaxvcの反対のアプローチです。

output = (input & 28) >> 2; 
関連する問題