2つの32ビット整数HI & LOがあります。これらのビットを右シフトする必要があり、HIの最後の最後のビットがLOの最上位ビットになります。換言すれば、2ビットが単一の64ビットユニットであるかのように、シフト動作が機能するはずである。言語C/C++
ありがとう!Cの2つのレジスタ間のシフト
-2
A
答えて
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;
まともなコンパイラは、通常、任意のコードを生成しない連結パターンを、認識することとなります。シフトは多かれ少なかれ最適なシーケンスを生成し、最終的なキャストは通常、通常はコードを生成しません。
関連する問題
- 1. アセンブラの2つのレジスタを移動(シフト)する
- 2. レジスタ内の値でビットをシフトする
- 3. 2つのファイル間のリンクエラーC++
- 4. Qt、C++ Draw 2つのオブジェクト間のコネクタライン
- 5. 2つのC#アプリケーション間の通信
- 6. 2つのプロセス間のFIFO通信c
- 7. 2つのリストビュー間のC#通信
- 8. 2つのC#アプリケーション間の接続
- 9. 右シフトの2つの要因を見つける
- 10. Python/C++/C#/ Javaの2つの文の間の関連性は?
- 11. 2つの数字の間のobj-c線形補間
- 12. SQL 2つの時間列の間の2つの時間値
- 13. シフト間の時間を計算する
- 14. C++ CPUレジスタの使用
- 15. Cの右シフト演算子?
- 16. 2つのアプリケーション間の通信(QtC++とC#の1つ)
- 17. アセンブリ8086:MOVとLEAだけの合計2つのレジスタ
- 18. x86 - 2つのレジスタの内容を交換する
- 19. CLレジスタを使用してシフトすると、レジスタの一部が停止しますか?
- 20. C++/C#配列シフトの類義語
- 21. 説明とレジスタの隣に2つのセクションdiv、1セクション2 divsまたは?
- 22. Verilogで2つのレジスタをサブ抽象化
- 23. スタックコレクションにC#2.0のシフトとシフト不足があります
- 24. アセンブリ言語+レジスタ間の移動値
- 25. Python:2つの列の間で同じ行エントリのシフトを示す出力を作成する
- 26. 2つのC#プログラムの間で大量のデータを送信
- 27. C++ LNK2019同じプロジェクトの2つのクラス間のエラー
- 28. C++ chrono秒の2つの時間の差
- 29. 2つの3Dベクトルの間のC++計算角度(0〜360)
- 30. 2つのフォーム間の変数の受け渡し、マルチスレッドC#
...あなたは何を試しましたか? –
Cでシフティング操作を使用してください。 –