判断两个整数符号是否相同

cfvmario 2011-08-02 11:21:30

int sameSign(int a, int b)
{
if ( a == 0 )
return 1;
else if ( a > 0 )
return b >= 0;
else
return b <= 0;
}

我想这么写,是不是效率会高一点?不是说if造成跳转影响效率么

int sameSign(int a, int b)
{
return a*b >= 0;
}
...全文
4234 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyworth98 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gz_qmc 的回复:]

数据的最高位表示符号位,1为负号,0为正号,0不分正负,认为是正号
因此:
C/C++ code

int sameSign(int a, int b)
{
return ((a^b)>>31)^1;
}



(a^b)>>31 是最高位异或的结果,相同为0,不同为1
再异或1就变成 相同为1,不同为0
[/Quote]


sp..................
赵4老师 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 anyidan 的回复:]
引用 13 楼 zhao4zhong1 的回复:
引用 12 楼 cfvmario 的回复:
所有用位操作的都有一个只能把0看做正数的问题吧。

所以说5楼才是正解啊!(^_^)


赵哥,谦虚是美德
[/Quote]
兹当是夸我呢吧。(我这个人最大的优缺点都是自我感觉良好。)
AnYidan 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhao4zhong1 的回复:]
引用 12 楼 cfvmario 的回复:
所有用位操作的都有一个只能把0看做正数的问题吧。

所以说5楼才是正解啊!(^_^)
[/Quote]

赵哥,谦虚是美德
enyblock 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhao4zhong1 的回复:]

引用 12 楼 cfvmario 的回复:
所有用位操作的都有一个只能把0看做正数的问题吧。

所以说5楼才是正解啊!(^_^)
[/Quote]

专门看了一下5楼
wy2001wy 2011-08-03
  • 打赏
  • 举报
回复
乘法的效率怎么也比if低吧,还是直接判断最高位比较靠谱
ylx10000 2011-08-03
  • 打赏
  • 举报
回复
都是牛人啊,Mark
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
好吧,你赢了,我改正
就是不比较,气死你

int sameSign(int a, int b)
{
return ((a^b)>>(sizeof(int)<<3-1))^1;
}
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
好吧,你赢了,我改正
就是不比较,气死你

int sameSign(int a, int b)
{
return ((a^b)>>(sizeof(int)<<8-1))^1;
}
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
好吧,你赢了,我改正
就是不比较,气死你

int sameSign(int a, int b)
{
return ((a^b)>>(sizeof(int)-1))^1;
}
icemornings 2011-08-02
  • 打赏
  • 举报
回复
如果在16位机上,int型是32位么?来看我的代码……
0视为正数。

/* 符号位是否为1 */
/* &后面的是常数,在编译时就可以计算出来 */
#define GET_SIGN(x) ((x) & (1 << (sizeof(int) * 8 - 1)))

int sameSign(int a, int b)
{
if (GET_SIGN(a) == GET_SIGN(b))
return 1;
else
return 0;
}

[Quote=引用 6 楼 gz_qmc 的回复:]
数据的最高位表示符号位,1为负号,0为正号,0不分正负,认为是正号
因此:

C/C++ code


int sameSign(int a, int b)
{
return ((a^b)>>31)^1;
}



(a^b)>>31 是最高位异或的结果,相同为0,不同为1
再异或1就变成 相同为1,不同为0
[/Quote]
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
数据的最高位表示符号位,1为负号,0为正号,0不分正负,认为是正号
因此:

int sameSign(int a, int b)
{
return ((a^b)>>31)^1;
}


(a^b)>>31 是最高位异或的结果,相同为0,不同为1
再异或1就变成 相同为1,不同为0

赵4老师 2011-08-02
  • 打赏
  • 举报
回复
KISS - Keep It Simple and Stupid.
int sameSign(int a, int b) {//0和负认为符号相同
if ((a >0 && b >0)
|| (a<=0 && b<=0))
return 1;
else
return 0;
}
cfvmario 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwwpppp628 的回复:]
return (a^b)>0;
不同返回0,相同返回1
[/Quote]
关键是要求0和负数视为符号相同的,用这个无法实现。
火头军 2011-08-02
  • 打赏
  • 举报
回复
不可以 相乘的话会出现溢出 比如 你输入 429496729 , -6 结果就不对了
Dirk 2011-08-02
  • 打赏
  • 举报
回复
return (a^b)>0;

不同返回0,相同返回1
hua_yang 2011-08-02
  • 打赏
  • 举报
回复
C/C++ code
int sameSign(int a, int b)
{
return a*b >= 0;
}

这种方式简单,但是要注意向上溢出问题(相乘容易造成溢出)
若a,b符号相同,但是当a*b超过上界时,结果就变成了负数

luuillu 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 luuillu 的回复:]

return !a||(a^b)>0 ;
[/Quote]
错了,修改为:

return !a || !b || (a^b)>0
luuillu 2011-08-02
  • 打赏
  • 举报
回复
return !a||(a^b)>0 ;
自由建客 2011-08-02
  • 打赏
  • 举报
回复
楼主的代码不是零为可正可负吗?
视零为负也简单,不过下面代码有个 bug ,就是参数不能是 INT_MIN ,否则会溢出。
#include <limits.h>

// 视零为负
int sameSign(int a, int b)
{
--a, --b;
return !((a^b) & INT_MIN);
}
rxngzq 2011-08-02
  • 打赏
  • 举报
回复
return (a^b)>0;
不同返回0,相同返回1

关键是要求0和负数视为符号相同的,用这个无法实现。

需求就是“0和负数视为符号相同”啊。
加载更多回复(7)

69,392

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧