(记录)利用位运算实现四舍五入
2021/10/11 23:45:02
本文主要是介绍(记录)利用位运算实现四舍五入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C语言中使用补码存储整数。
在C语言中,9(1001B)的一字节原码表示为00001001B
对于正整数而言,其原码,反码,补码均是其本身.
再来看一下-9的原码表示,比较简单,9的原码表示中最高位置1即可.即10001001B
-9的反码表示:这个是9的原码表示的按位取反.即11110110B
-9的补码表示:这个是-9反码表示再加1.即11110111B
不难发现,0的一字节补码是唯一的,即00000000B.
由此可见,非负数补码的最高位是0,负数补码的最高位是1
故我们可以写出一个判断已给定数值正负的代码:
#define SGN(Num) (-2 * (((int)(Num) >> 31) & 1) + 1) /* 非负数返回1 负数返回-1 */
由此,我们可以写出对给定小数四舍五入的代码:
#define ROUND(Num) ((int)(Num + 0.5 * SGN(Num))) /* 四舍五入 */
我们知道,x的整数部分[x]与其四舍五入ROUND(x)有如下关系:
[x] == ROUND(x - 0.5)
故根据余数计算公式,可知
a % b == a - ROUND(a / b - 0.5) * b)
完整代码如下:
#include <stdio.h> #include <stdlib.h> #define SGN(Num) (-2 * (((int)(Num) >> 31) & 1) + 1) /* 非负数返回1 负数返回-1 */ #define ROUND(Num) ((int)(Num + 0.5 * SGN(Num))) /* 四舍五入 */ int main(void) { int a,b; scanf("%d%d",&a,&b); printf("%d %% %d == %d\n",a,b,a - ROUND(a / b - 0.5) * b); system("pause"); return 0; }
这篇关于(记录)利用位运算实现四舍五入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南