算法面试题解析:仅使用指定运算符,实现问号表达式的功能

来源:互联网 发布:lol国服数据 编辑:程序博客网 时间:2024/06/01 10:34

题目和分析

按照问号表达式 x ? y : z 的语义,实现函数int cond (int x, int y, int z),只允许使用~,!, ^, &, +, |,<<和>>这几个运算符。不允许使用if, 循环或者其他。
可以强转类型,可以使用8bit的常量。
不允许使用宏额外的变量。

分析

简单来说,就是返回 y或者z。如果x的取值范围不是整数范围,而是0和1,那么可以表示为:
xy+!xz
但是存在两个问题:
1) 乘号不在被允许使用的运算符范围。
2) x的值实际上是整数,不是0和1

与乘号最接近的运算符是&,假设int为32位,那么对于任意一个整数m, 都有 0xffffffff& m = m, 0x00000000 & m = 0。

如果有个函数f(x),其定义为:
f(x)={0x00000000,x=0;0xffffffff,x=1.

下面的问题是:

怎么用那几个有限的运算符实现f(x)?

分析

  • 将x转变为0和1
    入口参数x,需要转变为0或者1,定义如下。
    b(x)={0,x!=0;1,x==0.

实际上,我们用逻辑运算!x和!!x,即可实现需要的转换。

  • 有符号整数的-1的16进制表示即为0xffffffff,而-1+1正好等于0(0x00000000),-1 +0等于-1。
    因此,可以定义为:
    f(x)=(0xffffffff + b(x))&y +(0xffffffff + !b(x))&z

考虑到整形长度在不同环境可能不同,我们不直接使用0xffffffff这样的值,而是直接将0按bit取反,即:~0

结论

最终我们得到的代码如下:

int cond (int x, int y, int z){   return ((~0 + !x) & y) + ((~0 + !!x) & z) ;}
0 0
原创粉丝点击