2016-02-02 3 views
5

いくつかのビット演算子で作業しています。数字の最後の16進数を抽出し、演算を行いたいと思います。私は基本的には0xFFFFFFFFのような負のintを見て、LSB FFFFを抽出し、0と連結して、0になり、代わりに0x0000FFFFのように見えます。 LSBが必要なすべての情報になるように、私はより小さい負の数だけを気にします。負数の最後の16進数を取得して連結するにはどうすればいいですか?

はここにCに私のアプローチです:

#include <stdio.h> 

int main(){ 
    int a = -1, c = 0; 
    short b = (short)a; 
    printf("a is %x\nb is %x",a,b); 
    c = (0 << 16) | b; 
    printf("\nc is %x\n", c); 
    return 0; 
} 

私の思考プロセスは、それが代わりにFFFFFFFFFFFFようになっていることを、私は良い時間を持っていますので、私は私のint a shortに変換することができています。残念なことに私にとっては、これはちょうど変数のffffffffを印刷します

+2

キャスト '(ショート)A'には不要です値は自動的に切り捨てられます –

+0

@LưuVĩnhPhúcありがとうございます。ビット操作に関しては、短くする理由はありますか? –

+2

場合によっては必要ですが、この場合は –

答えて

5

ビットワイズOR演算子(|)はどちらのオペランドにも設定されているビットをセットするので、あなたは何の問題もありません。

ビットワイズ演算子(&)を使用して、不要なビットをマスクします。どちらのオペランドでもクリアされているビットはクリアされます。

変更この:これに

c = (0 << 16) | b; 

c = b & 0xFFFF; 

そして、あなたの出力は次のようになります。任意のより広いので

a is ffffffff 
b is ffffffff 
c is ffff 
+0

ではないので、16のMSBでは 'c = b&0xFFFF0000'と言いますか? –

+1

@ user3470987ほぼそれはあなたに '0xFFFF0000'を与えます。 '0x0000FFFF'が必要な場合は、' c =(unsigned int)(b&0xFFFF0000)>> 16'を実行する必要があります。キャストは、 '1 'ビットが左からシフトされる可能性を防ぐために必要です。 – dbush

関連する問題