C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了按位乘以5/8观察溢出大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我被分配了许多问题,这是我唯一无法弄清楚如何优化更多的问题.

目标是乘以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观察溢出所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。