C/C++標準(see this link)によると、CおよびC++の>>演算子は、符号付き数値の算術シフトであるとは限りません。ビットが右にシフトされると、0(論理)または符号ビット(算術)がシフトインされるかどうかは、コンパイラの実装に依存します。C/C++ signed right shiftが特定のコンパイラの算術演算であることを確認しますか?
このコードは、符号付き整数の論理右シフトを実装するコンパイラのコンパイル時にASSERT(失敗)する機能を果たしますか?
#define COMPILE_TIME_ASSERT(EXP) \
typedef int CompileTimeAssertType##__LINE__[(EXP) ? 1 : -1]
#define RIGHT_SHIFT_IS_ARITHMETIC \
((((signed int)-1)>>1) == ((signed int)-1))
// SHR must be arithmetic to use this code
COMPILE_TIME_ASSERT(RIGHT_SHIFT_IS_ARITHMETIC);
論理シフトを使用しているマシンを持っている人には、どのような処理が行われませんか?そのようなマシン/コンパイラであなたのソフトウェアが使えないのはなぜですか?符号付き数値の右シフトが算術式か論理式かにかかわらず動作するように、コードを書く方が良いでしょうか? –
私はビットツイディリングを通じてブランチフリーセレクション(BFS)を使用しています。算術シフトが必要です。私はCOMPILE_TIME_ASSERT(RIGHT_SHIFT_IS_ARITHMETIC)を入れています。 BFSヘッダーに追加します。コードでは、RIGHT_SHIFT_IS_ARITHMETIC定義を使用して従来のパスまたはブランチのないパスを選択する必要があります。分岐予測ミスによるペナルティのために、PS3/XBOX360 CPUのブランチフリーコードを使用すると、大幅に高速化することができます。 – Adisak
ところで、コンパイル時に失敗したコンパイルは、理由が明示的に記載されているところで、コードが不思議に失敗するよりも優れています...基本的には、これらのルーチンはこのコンパイラ(またはCPU)ではサポートされていません。 – Adisak