按位乘以5/8观察溢出
发布时间:2020-12-16 10:05:35 所属栏目:百科 来源:网络整理
导读:我被分配了许多问题,这是我唯一无法弄清楚如何优化更多的问题. 目标是乘以5/8舍入为0并防止溢出.操作顺序乘以5然后除以8(即11 * 5/8 = 6).优化的目标是使用12个或更少的运算符. 只有规定! ? ^ | 允许操作和8位整数. 我目前对解决方案的尝试是 int trueFiveE
我被分配了许多问题,这是我唯一无法弄清楚如何优化更多的问题.
目标是乘以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名操作符. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |