首页 > 试题广场 >

请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、i

[问答题]
请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句。
//大家好,我是yishuihan
/*一看到这种不能用乘除、if等常规方法。那我们就要想到位运算;
在计算机中常用的就是与、或、非、异或、左移、右移运算等。
右移的情况比较复杂,假如是无符号数,那么右移,左边空出的位补0;
                    假如是有符号负数(正数),那么右移,左边会补1(补0);
所以建议使用左移;
a和b相减,如果结果大于0,最高位为0;否则,为负数最高位为1;
因为 在计算机中是使用补码存储的;下面的1<<31位,就是用1去与上最高位; */
#define cmp(a,b) (((a)-(b))&(1<<31))==1?-1:1;
//也可以这样写
#define cmp(a,b) (((a)-(b))&(0x80000000))==1?-1:1;

编辑于 2016-08-05 19:13:43 回复(3)
不能使用大于 小于号,就只能使用等于号判断了
让a,b两个数相减,根据最高位是0还是1判断正负,就可以比较大小了
假设a,b都是int型的,四个字节
将a-b的值强制类型转换为无符号型,这样就可以右移31位得到符号位了
#define cmp(a,b) (unsigned int)((a)-(b))>>31==1 ? -1:1

编辑于 2015-01-14 21:34:28 回复(4)

#define cmp(a,b) (((b) - (a) & (0x1 << 31)) >> 31)
#define max(a,b) (((fabs((a)-(b)))==((a)-(b)))?(a):(b))
发表于 2016-08-05 17:54:21 回复(1)