2012-02-27 4 views
-2

2つの32ビット整数HI & LOがあります。これらのビットを右シフトする必要があり、HIの最後の最後のビットがLOの最上位ビットになります。換言すれば、2ビットが単一の64ビットユニットであるかのように、シフト動作が機能するはずである。言語C/C++
ありがとう!Cの2つのレジスタ間のシフト

+3

...あなたは何を試しましたか? –

+0

Cでシフティング操作を使用してください。 –

答えて

1

以下のコードは、説明したとおり、右に1ビットシフトします。

hiの最下位ビット以外のすべてをマスクし、それを左にシフトして(Most Significant Bit)、これを右に1ビットシフトしたloと結合します。

次に、単にhiを右の1ビットにシフトします。

{ 
    lo = ((hi & 0x00000001)<<31) | (lo >> 1); 
    hi = hi >> 1; 
} 
1

あなたのCがlong long(64ビット)を持っている場合は入力し、それは、これを使用するのが最善ですが、二つの半分でそれを行う必要がある場合には、

LO = HI & 1 ? (LO >> 1) | 0x80000000 : (LO >> 1) & 0x7FFFFFFF; 
HI = (HI >> 1) & 0x7FFFFFFF; 
論理シフトのためにこのように書きます

負の数を右シフトした結果は、作業中のプラットフォームによって異なります。符号ビットを拡張する場合と拡張しない場合があります。このコードはどちらの可能性にも対応します。

+0

値が符号なし型の場合、 '&0x7FFFFFFF'部分は必要ありません。 – Lindydancer

1

コンパイラがlong longタイプ(すなわち、64ビット整数)をサポートしている場合は、次の操作を行うことができます:

unsigned long long joined = (((unsigned long long)hi) << 32) | lo; 
joined >>= 1; 
uint32_t new_low = (uint32_t)joined; 

まともなコンパイラは、通常、任意のコードを生成しない連結パターンを、認識することとなります。シフトは多かれ少なかれ最適なシーケンスを生成し、最終的なキャストは通常​​、通常はコードを生成しません。

関連する問題