博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法和数据结构】_12_小算法_abs_fabsf_fabsd_大端小端判断
阅读量:5887 次
发布时间:2019-06-19

本文共 1664 字,大约阅读时间需要 5 分钟。

  最近学习要用到求绝对值函数,看了一下有很多种的abs函数,因此想自己实现这些代码。

下面是我进行测试的代码:

#include 
typedef unsigned int U32,u32;typedef enum {FALSE,TRUE} BOOL;//求绝对值函数float fabsf(float x) { //这里可以看到浮点数和整数在计算机中的表达方式不一样 //下面的这种方法,不能用于整数 U32* p; p=(U32 *)&x; *p=*p & 0x7FFFFFFF; return x;}int abs(int x) { //负数的补码=反码+1=~源码+1 ;这个公式仅是对绝对值有效, //而符号位无关 /* if( x & 0x80000000 ) return ~(--x); else return x; */ //或者用下面的方法 return ( x & 0x80000000 ) ? ~(--x) : x ; /* 或者用下面的方法 return x>=0 ? x:(-1*x) ; */ }double fabsd(double x){ /* *因为double的sizeof(double)=8, *所以处理需要技巧 *这里我们可以利用char*指针进行处理 */ /* unsigned char* p; p = (unsigned char*)&x; p=p+7; *p=*p & 0x7F; return x; */ //也可以用下面的方法 if(x<0) return -1*x; return x;}BOOL isLittleEndian(){ /*可以用下面这种方法实现 U32 x=0x12345678; unsigned char *p; p=(unsigned char*)&x; if(!(*p ^ (unsigned char)0x78)) return TRUE; else //这里的else分支,其实可以不用 return FALSE; */ //也可以利用下面的方式实现 union { unsigned char x; unsigned int y; }a; a.y=(unsigned int)0x78; if(!(a.x^(0x78))) return TRUE; else //这里的else分支,其实可以不用 return FALSE;}int main(){ double x=fabsf(-123.0); U32 y=0x12345678; unsigned char *p; printf("fabsf(-123.0)=%f,sizeof(double)=%d",x,sizeof(double)); printf("\nabs(x)=%d",abs(-4)); printf("\nfabsd(x)=%f",fabsd(-300.123)); p=(unsigned char*)&y; printf("\n%x",*p); if(isLittleEndian()) { puts("\nYes"); } getchar(); return 0;}

  测试结果如下图所示:

  

转载于:https://www.cnblogs.com/volcanol/p/3356972.html

你可能感兴趣的文章
CentOS 6.4部署LAMP(多站点环境)
查看>>
javaweb开发之jsp
查看>>
2013年总结(2)-财务收入与支出
查看>>
React创建组件的三种方式
查看>>
Nginx 之 Location基础理解及实战
查看>>
企业级nginx服务优化合集
查看>>
maven配置cargo实现远程部署项目到tomcat
查看>>
ZABBIX API自动检查主机
查看>>
Linux系统基准
查看>>
几个简单的html+css+js题目
查看>>
MicroPython可视化编程开发板—TurnipBit自制MP3教程实例
查看>>
张双老师PHP开发实例教程持续更新中
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>
【quick-cocos2d-x】 CCHttpRequest用法
查看>>
sql 2005、2008维护计划备份数据库
查看>>
Windows 8没有失败的五个理由
查看>>
puppet之exec管理
查看>>
zipkin相关材料
查看>>
head,tail读取文件数据行
查看>>
路由相关
查看>>