目标是乘以5/8舍入为0并防止溢出. *** 作顺序乘以5然后除以8(即11 * 5/8 = 6).优化的目标是使用12个或更少的运算符.
只有规定! 〜& ^ | << >>允许 *** 作和8位整数.
我目前对解决方案的尝试是
int trueFiveEighths (int x){ int rightOne = x >>1; int rightTwo = x >>2; int temp = (x &(rightTwo) &1) + (((x ^(rightTwo))|(rightOne)|x)&(x>>31)&1); return (x>>3) + (rightOne) + temp;}
其中有14项业务.我没有办法让任何更多的运算符刮掉,我无法想出另一种方法.
解决方法 你可以除以八:int const eights = x >> 3;
得到余数:
int const rem = x & 7;
将每个乘以五:
eights += eights << 2;rem += rem << 2;
并添加任何新的整体:
eights += rem >> 3;
结合:
int const eights = x >> 3;int const rem = x & 7;return eights + (eights << 2) + (rem + (rem << 2) >> 3);
总计八个计算的运算符.
要将不能被8整除的负数舍入为零,请利用符号扩展(实现定义,因此不可移植,但可能是预期的解决方案)来获得负数的值7和正数的0:
int const negative_mask = x >> 31 & 7;return eights + (eights << 2) + (rem + (rem << 2) + negative_mask >> 3);
全部一起:
int const eights = x >> 3;int const rem = x & 7;return eights + (eights << 2) + (rem + (rem << 2) + (x >> 31 & 7) >> 3);
11名 *** 作符.
总结以上是内存溢出为你收集整理的按位乘以5/8观察溢出全部内容,希望文章能够帮你解决按位乘以5/8观察溢出所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)