正負が同じかどうか

2変数の符号が同じかどうかの判定だが、どうしたら効率がよいか?
まずは馬鹿正直にやってみると、

if( ( ( a < 0 ) && ( b < 0 ) ) || ( ( a > 0 ) && ( b > 0 ) ) ){
	・・・・・
}

しかしこの方法、長くなってしまうのでもうちょっとコンパクトにならないか?
よくやる技としては2変数を掛け算してその結果の符号が正ならばOKという方法。

if( a * b > 0 ){
	・・・・
}

数値計算屋さんがよくやる手です。別に教わるまでもなく普通にやってしまうところが生粋の数値計算屋さんですね(^^;
しかし、一般に掛け算は重い(と言われている)ので長くても馬鹿正直にやったほうがパフォーマンスはいいかもしれません。だけどやっぱりもっとコンパクトにしたいなぁと考えてしまうのが人間というもの(・・・てそうでなかったら人間とちゃうんかいな!!)

そういうわけで思いついた方法。

if( ( a < 0 ) == ( b < 0 ) ){
	・・・・
}

まあ、可読性はイマイチよくないですけど(^^;


あと、(32bit)整数に限定だとこんな技も

if( ~( a ^ b ) & 0x10000000 ){
	・・・・
}
//ちゃんと書くなら
if( ( ~( a ^ b ) & 0x10000000 ) != 0 ){
	・・・・
}
//若しくは
if( ( ( a ^ b ) & 0x10000000 ) == 0 ){
	・・・・
}

正か負かで上位1bitが変わることを利用してます・・・が可読性は激悪ですね(^^;


ちなみに0は正になるのか負になるのかとか全然考えてないので片方でも0だと挙動が違いますが仕様ということで(ぉ