算法面试题解析:仅使用指定运算符,实现问号表达式的功能
来源:互联网 发布:lol国服数据 编辑:程序博客网 时间:2024/06/01 10:34
题目和分析
按照问号表达式 x ? y : z 的语义,实现函数int cond (int x, int y, int z),只允许使用~,!, ^, &, +, |,<<和>>这几个运算符。不允许使用if, 循环或者其他。
可以强转类型,可以使用8bit的常量。
不允许使用宏额外的变量。
分析
简单来说,就是返回 y或者z。如果x的取值范围不是整数范围,而是0和1,那么可以表示为:
但是存在两个问题:
1) 乘号不在被允许使用的运算符范围。
2) x的值实际上是整数,不是0和1。
与乘号最接近的运算符是&,假设int为32位,那么对于任意一个整数m, 都有 0xffffffff& m = m, 0x00000000 & m = 0。
如果有个函数f(x),其定义为:
下面的问题是:
怎么用那几个有限的运算符实现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
- 算法面试题解析:仅使用指定运算符,实现问号表达式的功能
- JAVA问号?运算符的用法,问号表达式
- 面试题1_赋值运算符的实现
- 从面试题中学算法(1)--哈希表查找字符串中第一次仅出现一次的字母
- 标题栏问号按钮帮助功能的实现
- 标题栏问号按钮帮助功能的实现
- 标题栏问号按钮帮助功能的实现
- hash 算法面试题解析
- C# 双问号运算表达式
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)
- 面试题7_使用两个栈实现一个队列的功能
- 面试题~位运算实现两个整数的加法
- JS 问号运算符的问题
- JAVA问号?运算符的用法
- [面试题] 不用算术运算符实现两个数的加法
- Unity3D面试题-实现吊机吊物体的功能
- 面试题7:用栈来实现队列的功能。
- 2017年要学习的三个CSS新特性
- 了解并购
- Iptables
- a的b次方的前N位数和后N位数
- ahalei_10
- 算法面试题解析:仅使用指定运算符,实现问号表达式的功能
- ajax入门学习(一)
- UVa 11134 Fabled Rooks
- 素数环
- grep 命令
- A tutorial on Principal Components Analysis - 主成分分析(PCA)教程
- 集合概述
- org.hibernate.exception.ConstraintViolationException: could not execute statment 异常解决
- 9