13

C++で数値の符号ビットにアクセスできるようにしたい。私の現在のコードは次のようになります。

int sign bit = number >> 31;

それはうまくいくようで、0正の数と-1負の数が得られます。-1ただし、負の数を取得する方法がわかりません。12が

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100

次に-12は

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011

31ビットシフトすると

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

これは-1ではなく1ですが、シフトすると-1になるのはなぜですか?

4

9 に答える 9

31

これはどうですか?

int sign = number < 0;

于 2010-06-08T22:06:27.050 に答える
16

C ++で負の数を右シフトした結果は、実装によって定義されます。-12したがって、特定のプラットフォームでどのような右シフトを行うべきかは誰にもわかりません。上記()を作成する必要があると思いますが1、オールワンパターンを簡単に作成できると言います-1。後者は符号拡張シフトと呼ばれます。符号拡張シフトでは、符号ビットは右にコピーされますが、その場所からシフトされることはありません。

符号ビットの値だけに関心がある場合は、シフトなどのビット演算を使用して時間を無駄にするのをやめます。数値を0と比較して、負かどうかを確認します。

于 2010-06-08T22:07:17.027 に答える
8

符号付き整数をシフトしているためです。整数をunsignedにキャストします。

int sign_bit = ((unsigned int)number) >> 31;
于 2010-06-08T22:08:52.727 に答える
8

cmathライブラリを使用できます

#include <cmath>

のように使用します

std::cout << std::signbit(num);

この関数は、float値を入力として取得し、bool値を出力として取得します。

true for negative
false for positive

例えば

std :: cout << std :: signbit(1);

出力として0を返します(false)

ただし、この関数を使用するときは、ゼロに注意する必要があります

std::cout << std::signbit(-0.0);  // 512 (true)
std::cout << std::signbit(+0.0);  // 0   (false)

この行の出力は同じではありません。

この問題を取り除くには、次を使用できます。

float x = +0.01;
std::cout << (x >= 0 ? (x == 0 ? 0 : 1) : -1);

与える:

 0 for 0
 1 for positive
-1 for negative
于 2015-03-10T11:31:31.517 に答える
4

整数の場合は、テストしnumber < 0ます。

浮動小数点数の場合、ゼロには符号があるという事実も考慮に入れる必要があります。つまり、+0.0とは異なる-0.0が存在します。2つを区別するには、std::signbitを使用します。

于 2011-11-17T04:36:27.520 に答える
3

>>演算子は、数値の符号を保持する算術シフトを実行しています

于 2010-06-08T22:06:26.980 に答える
1
bool signbit(double x)
{
    return 1.0/x != 1.0/fabs(x);
}

+/-0をサポートする私のソリューション。

于 2013-12-06T13:42:10.893 に答える
0

次のことができます。

int t1 = -12;
unsigned int t2 = t1;
t2 = t2>>31;
cout<<t2;

これは、c++のすべての実装で正常に機能します。

于 2019-08-19T11:22:48.200 に答える
-1
bool signbit(double x)
{
    return (__int64)x & 0x8000000000000000LL != 0LL;
}

bool signbit(float x)
{
    return (__int32)x & 0x80000000 != 0;
}
于 2015-06-24T11:23:23.627 に答える