问题描述
问题:写一个函数,判断给定的两个数字是否是符号相同的,不可以使用比较运算符或与0比较。
例如
is_same_symbol(-1, 10) == false
;is_same_symbol(10,20)=true
;is_same_symbol(-1,-10)=true
; 同时,规定0属于正数。
方法分装
在二进制表示中,最高位是1的话,就是负数。最高位为0则为正数。因此我可以想办法通过位运算来判断。1 ^0 = 1。所以 负数^正数=负数。其实就是类似于乘法了。
function is_same_symbol($a,$b){
return (($a ^ $b) > 0);
}
$a=12;
$b=-10;
if (is_same_symbol($a, $b) == true){
printf ("same symbol");
}else{
printf ("not same symbol");
}
- 上面的例子 输出:
not same symbol
这里用到了比较运算符(
^
)。其实完全可以再简化一下,把函数中>0
的判断比较去掉,因为我们只需要知道第一位符号位
即可。
function is_same_symbol($a,$b){
return !(($a ^ $b) >> 31);
}
右移31位,则只剩下最高位符号位,不是0,就是1。
另外,如果处理非数字型,而是字符串型的数字,如
$a="100.01"
,$b="-10.01"
,只需转化成数字型即可。
END
如有问题请在下方留言。
或关注我的公众号“孙三苗”,输入“联系方式”。获得进一步帮助。