isPositive
-_x > 0
_の場合はtrue
を返し、それ以外の場合はfalse
を返します
例:isPositive(-1)
法務:_!
_ _~
_ _&
_ _^
_ _|
_ _+
_ _<<
_ _>>
_
最大操作数:_8
_
注:条件文は使用できません。
_inline bool isPositive(int32_t x) {
return ???;
}
_
return !((x & 0x80000000) >> 31 | !x);
int isPositive(int x) {
return !((x&(1<<31)) | !x);
}
x&(1<<31
は、数値が負であるかどうかを確認することです。
!x
は、数値がゼロかどうかを確認することです。
数値が負でもゼロでもない場合、その数値は正です。
int isPositive(int x)
{
return (!(x & 0x80000000) & !!x);
}
符号ビットで遊んでみましょう:sign(~n)
:1 if n> = 0
n
が0の場合を取り除くには:sign(~n + 1)
:1(n> 0またはn = MIN_INTの場合)
したがって、両方の関数が1を返す場合が必要です。
return ((~n & (~n + 1)) >> 31) & 1;
XOR (^)
を使用してみませんか?
これを試して、
{
return ((x>>31)&1)^(!!x);
}
0ケースにもうまく対応できます。
2の補数表現を想定すると(常にそうであるとは限りません!)、これは最上位ビットが設定されているかどうかをテストすることで実現できます(この場合、数値は負です)。
次のコードは不正な操作を使用していることに注意してください(+
、*
および-
)ただし、これらは明確さとプラットフォームの独立性のみを目的としています。特定のプラットフォームについて詳しく知っている場合、たとえばint
は32ビットの数値であるため、関連する定数を数値に置き換えることができます。
// Will be 1 iff x < 0.
int is_neg = (x & (INT_MAX + 1)) >> (CHAR_BIT * sizeof(int) - 1);
// Will be 1 iff x != 0.
int is_not_zero = !!x;
return !is_neg & is_not_zero;
サイネージビットとしてMSBを使用する記数法を使用している場合は、次のことができます。
int IsPositive(int x)
{
return (((x >> 31) & 1) ^ 1) ^ !x;
}
かなり長い間アセンブラを実行していませんが、私が覚えている限り、Wordの最初の桁は負の値を表します。 1000は-8であるため、最上位ビットが1の場合、数値は負になります。したがって、答えは!(x>>31)
です。