一个面试题,不运用函数,宏,只使用纯运算符构成表达式,判断一个整数的符号
一个面试题,不使用函数,宏,只使用纯运算符构成表达式,判断一个整数的符号
例如:short x;
有几种方法使得一个表达式 K, 让x经过一定的运算,结果:当x>0 时K=1;x<0时K=-1;x=0时K=0
K中不能有函数,宏,只能含有x和基本运算符
高手有几种办法?
------解决方案--------------------
if语句不就完了吗
------解决方案--------------------
if(k < 0)
负数
------解决方案--------------------
x = (k==0) ? 0 : k / (k > 0 ? k : -k);
这行不?
------解决方案--------------------
除了楼上的方法,再给你个方法:
------解决方案--------------------
k = (x > 0) - (x < 0);
------解决方案--------------------
抱歉,没看到不能用if和三眼操作
那只能想到用位操作了
------解决方案--------------------
k = (n<0)*-1+(n>0);
------解决方案--------------------
用位操作不难完成,楼主可以参考下《位操作基础篇之位操作全面总结》
http://blog.****.net/morewindows/article/details/7354571
------解决方案--------------------
k = !!(x > 0) - !!(x < 0);
------解决方案--------------------
?:也是运算符呀。
一般的对于整数,k=cond?A:B可以写成 k=(cond)*A + (!cond)*B (认为逻辑真值用1表示)
所以6楼的用?:写的表达式 x>0?1:(x==0?0:-1) 可以改写为:
(x>0)*1 + ( !(x>0) ) * ( (x==0)*0 + (!(x==0))*-1 )
带有 *1 的项不变,把 *-1 改为减法,删掉带有 *0 的子项
(x>0) - ( !(x>0) ) * ( !(x==0) )
合并逻辑式 !A&!B=!(A+B)
(x>0) - !( x>0 + x==0 )
注意第二项!(x>=0),就是x<0,于是化简为
(x>0) - (x<0)
得到8楼的答案。
------解决方案--------------------
(-x) &x=1; -((-x) &x))=-1;x-x=0;
1) 整数 k= x> (x-x) ? (-x) &x : x==x-x ? x-x ? -((-x) &x))
2) 实数,整数 k= x> (x-x) ? x/x :( x==x-x ? x-x :-x/x)
------解决方案--------------------
三目和比较都不允许的话可以这么搞
return x>>31
------解决方案--------------------
((unsigned int)(-x))>>31
------解决方案--------------------
1、(bool)x
------解决方案--------------------
(x >> 16)
2、(x > 0) + (x >> 15)
------解决方案--------------------
例如:short x;
有几种方法使得一个表达式 K, 让x经过一定的运算,结果:当x>0 时K=1;x<0时K=-1;x=0时K=0
K中不能有函数,宏,只能含有x和基本运算符
高手有几种办法?
------解决方案--------------------
if语句不就完了吗
------解决方案--------------------
if(k < 0)
负数
------解决方案--------------------
x = (k==0) ? 0 : k / (k > 0 ? k : -k);
这行不?
------解决方案--------------------
除了楼上的方法,再给你个方法:
x>0?k=1:(x==0?k=0:k=-1);
------解决方案--------------------
k = (x > 0) - (x < 0);
------解决方案--------------------
抱歉,没看到不能用if和三眼操作
那只能想到用位操作了
a^b的最高位 // 判断符号是否相同
a-b的最高位 // 符号相同时,判断大小
------解决方案--------------------
k = (n<0)*-1+(n>0);
------解决方案--------------------
用位操作不难完成,楼主可以参考下《位操作基础篇之位操作全面总结》
http://blog.****.net/morewindows/article/details/7354571
------解决方案--------------------
k = !!(x > 0) - !!(x < 0);
------解决方案--------------------
?:也是运算符呀。
一般的对于整数,k=cond?A:B可以写成 k=(cond)*A + (!cond)*B (认为逻辑真值用1表示)
所以6楼的用?:写的表达式 x>0?1:(x==0?0:-1) 可以改写为:
(x>0)*1 + ( !(x>0) ) * ( (x==0)*0 + (!(x==0))*-1 )
带有 *1 的项不变,把 *-1 改为减法,删掉带有 *0 的子项
(x>0) - ( !(x>0) ) * ( !(x==0) )
合并逻辑式 !A&!B=!(A+B)
(x>0) - !( x>0 + x==0 )
注意第二项!(x>=0),就是x<0,于是化简为
(x>0) - (x<0)
得到8楼的答案。
------解决方案--------------------
(-x) &x=1; -((-x) &x))=-1;x-x=0;
1) 整数 k= x> (x-x) ? (-x) &x : x==x-x ? x-x ? -((-x) &x))
2) 实数,整数 k= x> (x-x) ? x/x :( x==x-x ? x-x :-x/x)
------解决方案--------------------
三目和比较都不允许的话可以这么搞
return x>>31
------解决方案--------------------
((unsigned int)(-x))>>31
------解决方案--------------------
1、(bool)x
------解决方案--------------------
(x >> 16)
2、(x > 0) + (x >> 15)
------解决方案--------------------