曲径通幽论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: beyes
打印 上一主题 下一主题

面试题目集锦[基本概念]

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
11#
 楼主| 发表于 2011-11-16 10:24:58 | 只看该作者

不使用任何中间变量交换两数

不使用任何中间变量交换两数。

方法一
a = a + b;
b = a - b;
a = a - b;
上面方法的缺点是如果 a 和 b 是两个较大的数,那么执行 a = a + b; 时会产生越界。

下面方法采用异或运算,这样就无需担心越界的问题。

方法二
a = a ^ b;
b = a ^ b;
a = a ^ b;

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
12#
 楼主| 发表于 2011-11-16 11:41:00 | 只看该作者

找出两数中较大的一个

有两个变量 a 和 b,不用 "if" , "?:", "switch" 或其它判断语句,找出两个数中较大的。

方法一
[C++] 纯文本查看 复制代码
int max = ( (a + b) + abs(a - b) ) / 2;


方法二
[C++] 纯文本查看 复制代码
int c = a - b;
char *strs[2] = {"a Large ", "b Large "};
c = (unsigned)c >> (sizeof(int) * 8 - 1);
printf ("%s\\n", strs[c]);

上面的方法,通过判断最高位(第 31 位,符号位)来判断减法结果是正数还是负数,如果最高位为 1,那么计算结果是负数,说明 b 大于 a ;反之则 a > b 。
这里需要注意的是,(unsigned) 强制类型转换不能少,否则当 c 为负数时,用的是 sar 汇编指令进行移位,sar  指令会根据整数的符号位要么清空,要么置位移位造成的空位,所以这样一来,当 c 为负数时,使用 strs[c] 时就会产生错误,因为数组下标不可能是个负数,也就是数组下标被认为是 0xFFFFFFF4 这样的无符号整数时也是越界的。

当使用 unsigned 进行类型的强制转换后,汇编指令用的是 shr  指令进行移位,该指令针对无符号整数的移位操作。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 04:21 , Processed in 0.063669 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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