栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(记录)利用位运算实现四舍五入

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(记录)利用位运算实现四舍五入

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) 

由此,我们可以写出对给定数值四舍五入的代码:

#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 
#include 
#define SGN(Num) (-2 * (((int)(Num) >> 31) & 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 == %dn",a,b,a - ROUND(a / b - 0.5) * b);
	system("pause");
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316407.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号