几种讨巧的整形长度计算方法
企鹅15年校招笔试题中出了这么一道题:在不使用sizeof()函数的情况下,取出本机的整形所占位数,如32位、64位等。在我之前的一篇博客:企鹅2015校招笔试之(二)整形长度算法思路实现 中提供了一个常见的算法实现,现在在这里尝试几种讨巧的算法对其进行实现。
一、地址作差法
分析
申请一个整形数组,这样可以确保每两个连续数组元素在内存中所占用的地址是连续的,且地址之差一定为一个整形所占的字节数,通过字节数可以方便的求出整形所占用的位数。
源代码
#include<stdio.h>
int calculate(); // 判断整形所占字节数
int main()
{// 输出整形所占位数,其中位数=字节数×8printf("本台计算机整形所占位数为:%d\n", calculate() * 8);return 0;
}
int calculate()
{int sums[3]; // 申请一个数组,保证相邻元素地址连续int ret = -1; // 记录相邻元素之间的地址之差ret = (int)&sums[1] - (int)&sums[0]; // 计算相邻元素地址差/*因为整形的长度并不确定,因此无法保证所取到的地址进行强制转换后,一定能保证信息不丢失,因此在这里需要对其进行勘误。*/if(ret >=(int)&sums[2] - (int)&sum[1])ret =(int)&sums[2] - (int)&sum[1];return ret; // 返回所占字节数
}
二、变量溢出法
分析
申请一个整形变量,赋初值为0,对其进行累加,观察它什么时候数据溢出,通过这样也可以计算出一个整形所占用的位数。
源代码
#include<stdio.h>
#include<math.h>
int calculate(); // 判断整形所占字节数
int main()
{// 输出整形所占位数,第一位表示正负号printf("本台计算机整形所占位数为:%d\n", calculate()+1);return 0;
}
int calculate()
{int sum = 0; // 用来累加的整形变量double really = 0; // 用来比较判断是否溢出// 判断溢出whlie ((double)sum == really){// 若无溢出,依次累加sum++;really++;}sum=log(really)/log(2.0); // 求出所占位数return sum;
}
总结
上述两种方案都比较讨巧,其中第一种是非常推荐的,无论对于时间复杂度还是空间复杂度,都有较好的节约。
第二种算法虽然方便理解,但是耗时长,并不推荐。
几种讨巧的整形长度计算方法相关推荐
- 怎么解释卷积的两种不同运算结果长度的不同?
卓大大,打扰一下.我想问下您就是互相关运算和卷积在一定程度上是一样的运算吧,那为什么卷积之后序列长度是2N-1,而互相关运算的结果按照那个频域相乘再求快速傅里叶的逆变换得到的序列长度应该是就是之前的序 ...
- mysql中整形长度_mysql 整形的长度问题
标签: tinyint 有符号的范围是-128至127: 无符号的范围是0到255,2的8 次方-1: 存储大小为 1 字节. smallint 有符号的范围是-32768至32767: 无符号的范围 ...
- 四种方法求字符串长度
使用四种方法求字符串的长度 话不多说, 直接上代码: #include<stdio.h> #include<string.h>//计数器方法 int my_strlen1(ch ...
- 字符与字符串中的‘\0‘, ‘0‘, 0;strlen()函数求字符串长度计算方法(sizeof()验证)
先问一个问题:如下字符串or字符数组,用strlen函数求长度各是多少? /*01*/char * str1 = "abc"; /*02*/char * str2 = " ...
- 三种方法求字符串长度
在求字符串长度时,第一时间会想到运用strlen这个函数,但对于初学者来说,除了掌握这个函数之外,还应当自己写函数来实现相似的功能. 接下来我列举了三种方法来求字符串长度,供大家参考: (1)运用st ...
- 【深度学习】深度学习中模型计算量(FLOPs)和参数量(Params)等的理解以及四种在python应用的计算方法总结
接下来要分别概述以下内容: 1 首先什么是参数量,什么是计算量 2 如何计算 参数量,如何统计 计算量 3 换算参数量,把他换算成我们常用的单位,比如:mb 4 对于各个经典网络,论述他们是计算量大还 ...
- c语言存储空间分为哪三步,在C语言中,五种基本数据类型存储空间长度的排列顺序是:...
星轮系中在行,中种基线公绕固其他定轴构件转的又随一起齿轮,自身轴线自转既绕,称为. 多别号,本数吴昌硕,字昌硕,又署仓石.苍石,人..大聋.者有者等常见石尊. 心中浮现出的,据类间长学关心的认知们在某 ...
- python【数据结构与算法】一种时间复杂度和空间复杂度的计算方法
文章目录 1 算法的时间复杂度定义 2 推导大O阶方法 2.1 常数阶 2.2 线性阶 2.3 对数阶 2.4 平方阶 2.5 立方阶 3 常见的时间复杂度排序 4 算法空间复杂度 5 常用算法的时间 ...
- 三种方法获取列表长度
Get list length in Python 3 Examples len() function list = [10, 20, 30] n = len(list) print("Th ...
最新文章
- Shell脚本十三问
- 面试常问的29个linux命令
- boost::mp11::mp_transform_front相关用法的测试程序
- ZZ:深入理解new
- 51单片机独立键盘和矩阵键盘
- 使用Java 8防止日志过宽
- html个人主页_前端性能优化实践 之 百度App个人主页优化
- The Double-Checked Locking is Broken Declaration
- Spark in action on Kubernetes - 存储篇(一)
- 经典英语1000句(转)
- imagemagick /tmp/magick-xxxxxxxx
- php物联网智能家居系统源代码,基于物联网技术的智能家居控制系统设计方案
- EDI电除盐纯水设备
- css基本语法选择器
- 看《西游记》谈团队管理
- 微信小程序个人和企业有什么不一样(个人和企业小程序的区别)
- Docker容器内部无法访问外网原因之一
- 微信内置浏览器 非全屏播放视频解析
- 上海工程技术大学c语言试卷,上海工程技术大学2009_2010C语言试卷A.doc
- 让你的 CDN 费用省 50% 以上!图片瘦身的正确姿势