LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: soloforce

一道面试题:编写一个函数比较两个整数大小,但不能使用任何比较操作符

[复制链接]
发表于 2006-9-9 00:06:50 | 显示全部楼层
Post by biinn
  1.     bit_width = sizeof(int) << 3;   
  2.     msb = var2 >> (bit_width -1) -
  3.           var1 >> (bit_width -1);
  4.     if (msb)
  5.         rtnvar = msb;
  6.     else
  7.         rtnvar = var1 - var2;
  8.     return rtnvar;
  9. }
复制代码
……佩服! 精炼!立刻跟上,进行修改。


P.S.
我这边gcc4.1下, -1234 >> 31 的结果是-1而不是1…… C标准怎么说的呀?我都忘了。

biinn,这样的话
    msb = var2 >> (bit_width -1) - var1 >> (bit_width -1);
是不是应该改为:
   msb = var1 >> (bit_width -1) - var2 >> (bit_width -1);
回复 支持 反对

使用道具 举报

发表于 2006-9-9 00:34:41 | 显示全部楼层
Post by MatthewGong
……佩服! 精炼!

Thanks,  Matthew. We have the similar idea actually!
Post by MatthewGong
lolita版主放个话吧,有没有看到更好的?

She has the greatest one in her mind! ;-)
回复 支持 反对

使用道具 举报

发表于 2006-9-9 08:57:40 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc,char *argv[])
  4. {
  5.         int num1,num2;
  6.         int i = 0;
  7.         char result[3][32];
  8.         if(argc != 3)
  9.         {
  10.                 printf("Usage: cmp_int num1 num2\n");
  11.                 exit(1);
  12.         }
  13.         sprintf(result[0],"%s = %s",argv[1],argv[2]);
  14.         sprintf(result[1],"%s > %s",argv[1],argv[2]);
  15.         sprintf(result[2],"%s < %s",argv[1],argv[2]);
  16.         num1 = atoi(argv[1]);
  17.         num2 = atoi(argv[2]);
  18.         i = (((num1 - num2) >> 31) * 2) + ((num2 - num1) >> 31);
  19.         printf("Result: %s\n",result[-i]);
  20.         return 0;
  21. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-9 09:16:52 | 显示全部楼层
Post by MatthewGong

我这边gcc4.1下, -1234 >> 31 的结果是-1而不是1…… C标准怎么说的呀?我都忘了。
有符号负整数向右移位是用指令SAR实现,即负数移位造成的空位全部用1填充,正数则用0填充。
所以 -1234>>31 = 二进制的(1111....1111),即 -1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-9 09:38:29 | 显示全部楼层
Post by biinn
Please check this version:
  1. int comp_int(int var1, int var2)
  2. /* return value < 0: means var1 < var2;
  3. *              = 0: means var1 = var2;
  4. *              > 0: means var1 > var2;
  5. */
  6. {
  7.     int bit_width, msb, rtnvar;
  8.     bit_width = sizeof(int) << 3;   
  9.    [color="Red"] msb = var2 >> (bit_width -1) -
  10.           var1 >> (bit_width -1);[/color]
  11.     if (msb)
  12.         rtnvar = msb;
  13.     else
  14.         rtnvar = var1 - var2;
  15.     return rtnvar;
  16. }
复制代码

的确精练!
不过红色那句是否应该改为:
   [color="blue"] msb = ( var1 >> (bit_width -1) ) -  (var2 >> (bit_width -1));

1、 加减号优先级高于移位运算。
2、见上一帖 MatthewGong 所说的
回复 支持 反对

使用道具 举报

发表于 2006-9-9 09:40:00 | 显示全部楼层
Post by Lolita
有符号负整数向右移位是用指令SAR实现,即负数移位造成的空位全部用1填充,正数则用0填充。
所以 -1234>>31 = 二进制的(1111....1111),即 -1

C语言是算术移位,而不是逻辑移位
回复 支持 反对

使用道具 举报

发表于 2006-9-9 09:44:24 | 显示全部楼层
我觉得既然不能使用比较操作符,我觉得象if,switch这些个东西也不应该用进来,要不这实际上也是用了比较的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-9 09:49:57 | 显示全部楼层
Post by Arthur.Echo
C语言是算术移位,而不是逻辑移位

正是算术位移,不过我记名词经常搞混,所以干脆只说字面意思
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-9 09:57:14 | 显示全部楼层
Post by Arthur.Echo
我觉得既然不能使用比较操作符,我觉得象if,switch这些个东西也不应该用进来,要不这实际上也是用了比较的。


如果分支、循环都不能用,就很难了。
回复 支持 反对

使用道具 举报

发表于 2006-9-9 10:22:15 | 显示全部楼层
Post by Lolita

不过红色那句是否应该改为:
   [color="blue"] msb = ( var1 >> (bit_width -1) ) -  (var2 >> (bit_width -1));
1、 加减号优先级高于移位运算。

多谢版主指正,我从来就搞不清操作符的优先级。这次懒了一下,没加括号。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表