如何用C语言获得整数所需的最少二进制位数

本文介绍了如何在C语言中确定无符号整数的最小二进制位数,提供了两种不同的解决方案:一种是基于折半法的高效算法,另一种是简单的线性遍历算法,分别分析了它们的时间复杂度和适用场景,并给出了完整的实现代码及测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(声明:此为原创,首发于http://blog.youkuaiyun.com,转载请注明 “作者:究竟实相,邮箱:LmjLmj8@163.com”。本文所给代码可未经本人允许而做任何使用,但是本人不承担因此造成的任何后果)

最近在开发一个业务规则的项目,遇到一个问题,就是要判断一个无符号整数的有效二进制位数是多少。例如,5的二进制形式为101b,有3个二进制位,17的二进制形式为1 0001b,有5个二进制位。问题:已知n∈[0, pow(2, 31) ),求n的二进制位数。笔者这里给出这个问题的解决过程。所有代码在Visual Studio 2013 Express测试通过。由于编辑器出了问题,无法用中文来表示代码注释,请原谅。限于笔者水平有限,这里给出的代码可能还有一些不足,请大家指正。


拿到问题后,我在纸上列举了一些例子,以观察规律。例子如下:

二进制位数举例
无符号整数 二进制位数
0~1 1
2~3 2
4~7 3
8~15 4
16~31 5
32~63 6
64~127 7

显然这是一个多对一的映射。观察后,可发现,从数学角度来说,可使用函数floor(log2(n)) + 1来求取任意无符号整数的二进制位数,其中floor()表示向下取整,log2(n)表示以2为底数n的对数。


由于对数运算涉及到小数运算,有可能导致精度损失和性能偏低的问题,因此,我决定另找路子。


思路1:设n为32位无符号整数&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值