3

演算子のみを使用して、32ビット整数(最上位ビット)の符号ビットを見つける方法が必要です。〜&^ | +。0xFFまでの定数しか使用できませんが、それより大きな数を作成できます。そしてそれはインラインコードでなければならず、ループや条件文はありません

はい、これは割り当て用ですが、これは全体の問題ではなく、確認する必要があるマイナーなケースにすぎません。

除算を使用して実行できるx>>31を実行することで符号を取得できることはわかっていますが、それは、使用できないビットシフトを増やす必要があるだけです:(

演算子が少なければ少ないほど良いのです。なぜなら、私は問題全体を実行するのに10しか許可されておらず、これはマイナーなケースにすぎないからです。

これの問題は、数値xが0x7FFFFFFFに等しいかどうかを確認することです。私のコードが今読む方法は[(xは負ですか?)&(x + 1は負です)]です。xが0x7FFFFFFFに等しい場合、1を加算するとバッファがオーバーフローし、xが負になります。ただし、このロジックは、xが事前に負でない場合にのみ機能します。したがって、最初の部分。

お願い助けて???

4

3 に答える 3

5

符号ビットのテストは困難です。問題全体について、次のようなものを探していると思います

!((~x) ^ (x + 1))

~xこれは、とx + 1がビットごとに同一であること、つまり同じ数であることをテストします。

于 2012-09-25T10:43:59.940 に答える
1

ユニオンの使用は許可されていますか? これは、他のパラメータと一致しています。プロセッサのエンディアンを注意深く確認してください。これにより、配列のインデックスを 0 にするか 3 にするかが決まります。

typedef union
    {
    int integer;
    unsigned char byte[4];
    } IntSplitter;

IntSplitter a;
a.integer = ValueToBeTested + 1;
// now the value (a.byte[3]&0x80) returns 1 for neg or 0 for pos
// for example
if(a.byte[3]&0x80)
    // code if negative..

編集:エンディアンによってインデックスが 0 か 3 かが決まると既に述べました。間違っていても、これを行う他の方法は非常に簡単です...実際には、前の例よりもはるかに簡単です。

#ifdef BIG_ENDIAN
typedef union
    {
    int integer;
    struct
        {
        unsigned IsNegative :1
        unsigned :7
        unsigned :8
        unsigned :8
        };
    }CheckNeg_t
#else
typedef union
    {
    int integer;
    struct
        {
        unsigned :8
        unsigned :8
        unsigned :7
        unsigned IsNegative :1
        };
    }CheckNeg_t
#endif

CheckNeg_t a;
a.integer = ValueToBeTested + 1;

if(a.IsNegative)
    // code if negative..
于 2012-09-25T11:30:26.933 に答える
0
#include <limits.h>

negative = !!(INT_MIN & number);
于 2012-09-25T14:53:55.417 に答える