1、There are two int variables : a and b , don't use "if","? :","switch" or other judgement statements , find out the biggest one of the two numbers.
程序如下:
------------------------------------------------------------
#include <stdio.h>
int main()
{
int a , b ,c;
unsigned d;
char *strs[2] = {"a的值较大","b的值较大"};
printf("请输入两个数:/n");
while(scanf("%d%d",&a,&b) != 2);
c = a - b;
d = (unsigned)(c) ;
d = d >>(sizeof(int)*8 - 1);
printf("%s",*(strs+d));
return 0;
}
------------------------------------------------------------
理解上面这个程序的数据比较方法的关键是数据在内存中的存储方式:所有的数据在计算机中都是以二进制形式存储的,正数最高位用0表示,负数最高位为1。因此我们可以判断(a -b)的最高位是0还是1。由于(a-b)结果是正还是负是未知的!我们需要将这个结果转换为无符号数,然后通过移位直到将原来的最高位移到最低位就可以找到这个最高位了。由于不能使用判断语句,我们也不能在这时与1或0比较。这个时候我们也使用了一个技巧,将结果输出来!直接输出移位后的结果,这样显然不太文雅,看看我们的程序是如何做的吧! 前面讲了通过移位来获取最高位,那么应该移几位呢?这个我们需要判断(a-b)有几位!sizeof(int)*8,首先判断有几个字节,然后计算位数!
这个地方使用sizeof(unsigned)*8 结果也是一样的!我们可以通过在上面程序的最后加上下面的两句 :
printf("The size of unsigned is %d/n",sizeof(unsigned));
printf("The size of int is %d/n",sizeof(int));
可以看到这两句的数据结果是一样的,在32位机器上的vc中都是4。
其实,求解该题还有另一种方法,即:(a+b+abs(a-b))/2
2、如何将a和b的值进行交换,并且不使用任何中间变量?
方法一、
a=a+b;
b=a-b;
a=a-b;
这种方法有一个问题,就是当a和b数值较大时容易产生越界溢出现象。那么有没有一种方法可以避免此方法的缺陷呢?有,采用如下所示的异或运算!
方法二、
a=a^b;
b=a^b;
a=a^b;
参考文献
[1]http://www.yuanma.org/data/2009/0922/article_3932.htm
[2]程序员面试宝典