C言語ビット操作--整数を判断する記号
2077 ワード
計算操作の測定方法について:
アルゴリズムに対して操作の数を統計すると,すべてのC演算子は同じ操作と考えられる.中間プロシージャはランダムメモリに書き込まれません(RAM)は計算されないが、当然、このようなオペランドの計算方法は、マシン命令とCPU実行時間に近いサービスとしてのみ用いられる.すべての操作は、同じ実行時間がかかると仮定されているが、実際には正しくない.キャッシュサイズ、メモリ帯域幅、命令セットなど、1つのシステムがどれだけ早く実行できるかを決定する様々な要因がある…を待つ.最後に、一つの基準を確立することこそ、一つの方法が別の方法より速いことを測定する最善の方法である.
整数の記号を判断します.
テストコード:
上の最後の文を評価します:sign=v>>31 for 32-bit integers、これは通常の操作:sign=-(v<0)です.より速い方法では、このテクニックは、シンボル整数が右にシフトすると、一番左のビットが他のビットにコピーされ、一番左のビットが1で、この整数が負数であることを示し、そうでないと0で正数になるためです.すべてのビットが1である場合に−1が返されるが,この挙動は特定の構造に向いている.
あるいは、あなたが返すのがもっと好きな結果は-1または+1で、次の表現があります.
または、結果の戻り形式は-1,0,+1であり、以下の表現形式を使用することができます.
数値が負でないかどうかを知りたい場合は、+1または0の値を返します.sign=1^(unsigned int)v>>(sizeof(int)*CHAR_を使用できます.BIT - 1));//v<0が0を返す場合、そうでない場合は1を返します.
アルゴリズムに対して操作の数を統計すると,すべてのC演算子は同じ操作と考えられる.中間プロシージャはランダムメモリに書き込まれません(RAM)は計算されないが、当然、このようなオペランドの計算方法は、マシン命令とCPU実行時間に近いサービスとしてのみ用いられる.すべての操作は、同じ実行時間がかかると仮定されているが、実際には正しくない.キャッシュサイズ、メモリ帯域幅、命令セットなど、1つのシステムがどれだけ早く実行できるかを決定する様々な要因がある…を待つ.最後に、一つの基準を確立することこそ、一つの方法が別の方法より速いことを測定する最善の方法である.
整数の記号を判断します.
int v; // v
int sign; //
sign = -(v < 0); // if v < 0 sign= -1, else 0.
// cpu
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1)); // CHAR_BIT ( 8).
// ( )
sign = v >> (sizeof(int) * CHAR_BIT - 1);
テストコード:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<limits.h>
int test(int v)
{ // 0, -1
int sign;
sign = -(v < 0);
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1)); // CHAR_BIT ( 8).
sign = v >> (sizeof(int) * CHAR_BIT - 1);
return sign;
}
int main()
{
int v;
scanf("%d",&v);
printf("%d
",test(v));
getchar();
getchar();
return 0;
}
上の最後の文を評価します:sign=v>>31 for 32-bit integers、これは通常の操作:sign=-(v<0)です.より速い方法では、このテクニックは、シンボル整数が右にシフトすると、一番左のビットが他のビットにコピーされ、一番左のビットが1で、この整数が負数であることを示し、そうでないと0で正数になるためです.すべてのビットが1である場合に−1が返されるが,この挙動は特定の構造に向いている.
あるいは、あなたが返すのがもっと好きな結果は-1または+1で、次の表現があります.
ign = +1 | (v >> (sizeof(int) * CHAR_BIT - 1)); // v < 0 -1, +1
または、結果の戻り形式は-1,0,+1であり、以下の表現形式を使用することができます.
sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
// ,
sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1)); // -1, 0, or +1
// 、
sign = (v > 0) - (v < 0); // -1, 0, or +1
数値が負でないかどうかを知りたい場合は、+1または0の値を返します.sign=1^(unsigned int)v>>(sizeof(int)*CHAR_を使用できます.BIT - 1));//v<0が0を返す場合、そうでない場合は1を返します.