资讯详情

cosmos 位运算系列:十进制转二进制(base 10 → base 2)的商余法原理与多语言实现指南

📅 2026/9/23 5:24:27 | 华诺云谱 👁 阅读
cosmos 位运算系列:十进制转二进制(base 10 → base 2)的商余法原理与多语言实现指南
教程示例工程【免费下载链接】cosmosWorlds largest Contributor driven code dataset | Used in Quark Search Engine, OpenGenus IQ, OpenGenus Visual Project项目地址https://gitcode.com/gh_mirrors/co/cosmos点击查看免费下载本指南以 cosmos 仓库中 convert_number_binary 模块文档 为核心系统讲解如何将一个十进制base 10整数转换为二进制base 2表示从反复除以 2 取余数的核心算法出发逐步推导 8 位定长二进制示例并对照仓库内 Python、C、C、Java、JavaScript、PHP、Haskell 七种语言的实现与测试用例揭示模运算、位运算两种等价写法的底层原理与边界处理。读完本文你将能够徒手完成任意十进制到二进制的转换并理解固定位宽、负数、零值等边界情况在真实工程代码中的处理方式。模块定位把十进制数转换为二进制数在 cosmos 仓库的位运算bit manipulation分类下convert_number_binary 模块的全部程序只围绕一件事把 base 10十进制的数转换为 base 2二进制的数。二进制是现代计算机内部表示数据的唯一形式因此理解并实现这一转换是理解位运算、内存布局、定点数与哈希函数等一切底层话题的前提。二进制数只允许出现2种数字0和1。下表给出了十进制与二进制的对应关系摘自模块文档Decimal十进制Binary二进制001121031141001610000从表中可以直观感受到两条规律二进制逢二进一一个十进制数n的二进制表示长度约为⌊log₂n⌋ 1位例如16 10000₂共 5 位。核心算法反复除以 2 的商余法mod / quot文档中给出的转换思路非常朴素且严谨每一步只做两件事mod取模用除数2除被除数只保留余数quot求商用除数2除被除数只保留商。设十进制数为n二进制结果b共有k位即b bₖ₋₁ bₖ₋₂ … b₁ b₀其中bₖ₋₁是最高位 MSBb₀是最低位 LSB则算法流程为step 1n mod 2 bₖ₋₁本步的余数成为二进制的最高位n quot 2 n₁商进入下一轮迭代step 2n₁ mod 2 bₖ₋₂n₁ quot 2 n₂…… 持续迭代直到商为0final stepnₖ₋₁ mod 2 b₀nₖ₋₁ quot 2 0算法终止。这一过程在算法上被称为短除法 / 除 2 取余法从最低位开始逐位确定二进制结果先算出的余数应排在最右侧低位。值得注意的是文档将k定义为二进制数b的位数这意味着算法天然支持定长输出——即使商已经变成 0只要尚未填满k位就继续用0 mod 2 0补足高位详见下一节示例。完整推导示例把 5 转为 8 位二进制 00000101文档以n 5, k 8为例演示了完整 8 轮推导过程整理如下轮次被除数mod 2余数 → 位quot 2下一轮被除数151→ b₇2220→ b₆1311→ b₅0计算到此已结束400→ b₄0500→ b₃0600→ b₂0700→ b₁0800→ b₀0按b₇ b₆ b₅ b₄ b₃ b₂ b₁ b₀从高位到低位排列得到b [0, 0, 0, 0, 0, 1, 0, 1] → 00000101验证00000101₂ 0×2⁷ 0×2⁶ 0×2⁵ 0×2⁴ 0×2³ 1×2² 0×2¹ 1×2⁰ 4 1 5✔这个例子透露了三个要点其一真正的有效计算只持续到商变为 0第 3 轮之后均为补零其二第一次算出的余数反而是最低位这里5 mod 2 1对应 b₀ 方向的最近一位文档写作 b₇ 是因为定长 8 位下它落在最右侧其三定长位宽k给了我们显式的补零策略这在处理有符号数、协议字段等场景中非常实用。仓库中的七种语言实现与运行方式模块目录 code/bit_manipulation/src/convert_number_binary 下提供了同一算法的多语言实现它们在思路上分为模运算逐位拼接与位运算逐位拼接两大流派。下面逐一解读。Python字符串拼接版convert_number_binary.pydef intToBinary(i): if i 0: return 0 s while i: if i % 2 1: s 1 s else: s 0 s i / 2 return s逻辑与文档的商余法完全一致每次取i % 2得到一位余数通过s 1 s把新位前插到字符串头部天然实现了先算出的余数放低位、后算出的放高位的逆序修正循环条件while i等价于商不为 0 就继续。特殊地0被单独处理为0若走循环则输出空串。从源码结构看这里的i / 2沿用 Python 2 的整除语义在 Python 3 下建议改写为i // 2以保证严格的整数除法。运行方式python3 code/bit_manipulation/src/convert_number_binary/convert_number_binary.py # 输出 741 的二进制C数值累加版附带 1 计数convert_number_binary.c 不使用字符串而是把二进制结果直接构造成一个十进制外观的long型数值并顺带统计二进制中1的个数while (num 0) { remainder num % 2; if (remainder 1) { no_of_1s; /* 统计 1 的个数 */ } binary binary remainder * base; num num / 2; base base * 10; /* 按十进制位权逐位累加 */ }base每轮乘 10使binary呈现为101这样的数值形式配合scanf(%ld)交互输入并输出原数、二进制等价形式、二进制中 1 的个数三项。需要注意这种以数值模拟字符串的做法在输入较大时存在long溢出风险工程上更推荐字符串或数组方案。编译运行gcc code/bit_manipulation/src/convert_number_binary/convert_number_binary.c -o conv ./convC位运算版含反向转换convert_number_binary.cpp 使用位运算替代取模是理解模 2 ↔ 与 1、除 2 ↔ 右移 1等价关系的最佳范例string to_binary(int n) { string binary ; while (n 0) { if ((n 1) 0) binary 0 binary; else binary 1 binary; n 1; } return binary; }这里n 1取出最低位等价于n % 2n 1整体右移一位等价于n / 2配合前插字符串即可完成转换。文件还给出了反向函数to_number(string s)用1 (n - 1 - i)按位权累加二进制串。main中以to_binary(10)应输出1010与to_number(111)应输出7自测。Java位运算版含反向转换convert_number_binary.java 与 C 版如出一辙toBinary(int n)用(n 1)判位、n 1右移StringBuilder前插拼接toNumber(String s)用1 (n - 1 - i)还原十进制。main中以toBinary(20)与toNumber(10101)验证应分别输出10100与21。编译运行javac code/bit_manipulation/src/convert_number_binary/convert_number_binary.java java -cp code/bit_manipulation/src/convert_number_binary ConvertNumberBinaryJavaScript内置函数版 位运算版convert_number_binary.js 同时提供了两条路径是最贴近实战选型的实现// 内置函数简洁可靠 function toBinary(val) { return val.toString(2); } function fromBinary(bitString) { return parseInt(bitString, 2); } // 位运算不依赖内置 API逻辑透明 function toBinary_B(val) { let out ; while (val 0) { out (val 1) out; val 1; } return out; }Number.prototype.toString(2)与parseInt(bitString, 2)是 ECMAScript 内置的进制转换入口适合生产环境toBinary_B/fromBinary_B则完整复刻了商余法与位权累加便于学习与移植到无内置 API 的环境。PHP双向转换 内建测试用例convert_number_binary.php 提供了decimal_to_binary与binary_to_decimal两个方向且文件底部自带断言式测试数据可直接作为算法正确性的验证依据// decimal_to_binary 测试对摘自源码 [0, 0], [1, 1], [2, 10], [5, 101], [9, 1001], [10, 1010], [4692, 1001001010100], [4852, 1001011110100]decimal_to_binary用$bin $bin ($i * $rem)配合$i * 10构造数值型二进制结果binary_to_decimal则把每一位乘以其 2 的幂次累加。运行php code/bit_manipulation/src/convert_number_binary/convert_number_binary.php即可看到每个用例的OK / FAIL输出。Haskell定长位宽版函数式实现convert_number_binary.hs 是全部实现中唯一把定长k位作为一等参数的版本与文档n mod 2 bₖ₋₁的符号体系高度吻合convDecToBin :: Int - Int - Binary convDecToBin k n | n 0 case convDecToBin k n of Left s - s Right b - b | otherwise negativeNumberNotSupported -- 负数显式拒绝辅助函数convDecToBin每次递归把n quot 2与n mod 2传入下一层位串按show r b前插当位数耗尽而商仍大于 0 时返回needMoreBits位数不足位数或商为 0 时正常收尾。文件末尾的断言覆盖了定长转换convDecToBin 3 3 011、大数convDecToBin 32 32、位数不足convDecToBin 2 4报错与负数convDecToBin 2 (-4)拒绝四类场景可直接用 GHC 运行验证。位运算视角为什么n 1和n 1等价于取模与除法对比 C/Java/JavaScript 的位运算版与 Python/C/PHP 的模运算版可以得到一组在整数运算中恒成立的等价关系算术写法文档语义位运算写法说明n mod 2n 12 的二进制是10₂n 1只保留最低位恰好是除以 2 的余数n quot 2n 1二进制右移一位相当于整体除以 2商即移走最低位后的剩余部分这正是整个模块被归入 bit_manipulation位运算分类的原因十进制转二进制的本质就是反复丢弃最低位右移并把丢弃的位记录为结果。两种写法对非负整数结果完全一致位运算版本在底层通常映射为单条机器指令在追求极致性能的场景如嵌入式、内核代码中更为常见。需要说明的是对于有符号负数的右移不同语言存在算术右移/逻辑右移差异因此上述等价关系以非负整数为适用前提——Haskell 实现中对负数直接返回错误信息正是对这一前提的工程化处理。边界情况与工程注意点综合文档的定长推导与各语言实现至少有三类边界值得在工程中处理零值Python 实现单独返回0若走通用循环0的二进制串会是空串必须特判。负数文档算法基于非负整数推导Haskell 版显式返回negativeNumberNotSupported拒绝负数。实际工程中负数通常采用补码表示需先按符号规则变换再决定是否使用定长位宽输出。位宽不足 / 溢出Haskell 版当位数k小于实际所需时返回needMoreBitsC 版以数值累加模拟字符串大数存在long溢出风险Python 版使用字符串拼接则无此问题。定长输出的需求如协议字段应显式补零。反向转换二进制转十进制进制转换的闭环模块目录还包含反向实现 binary_to_integer.py采用从左到右的霍纳式累加def binary_to_int(binary_input): integer_output 0 for digit in binary_input: integer_output integer_output * 2 int(digit) return integer_output每次integer_output * 2 int(digit)等价于把已累加的二进制串整体左移一位并追加新位循环结束后即为十进制值C 与 Java 实现中的toNumber则按位权1 (n - 1 - i)累加PHP 版同样提供binary_to_decimal。正反两个方向共同构成完整的进制转换闭环也是验证正向转换正确性的天然工具对任意十进制数nbinary_to_int(intToBinary(n)) n恒成立。复杂度分析设十进制输入为n非负整数二进制结果位数为k ⌊log₂n⌋ 1时间复杂度每次迭代执行一次取模/取位与一次除法/右移共迭代k轮每轮 O(1)总体O(log n)空间复杂度字符串/数组实现需保存k位结果为O(log n)以数值累加模拟字符串的 C 版本为 O(1) 额外空间但以溢出风险为代价。这也是短除法在进制转换场景中被称为最优朴素算法的原因——输出本身就有O(log n)位任何算法都不可能优于线性于输出规模。小结围绕 cosmos 仓库 convert_number_binary 模块文档 的商余法本文完成了从算法原理、手算推导5 → 00000101到七种语言实现的完整拆解模运算版与位运算版n 1/n 1在非负整数域上严格等价定长位宽、零值与负数处理是工程落地的关键细节反向转换如 binary_to_integer.py与 PHP 版内建测试用例为正确性提供了闭环验证。读者可将本模块作为位运算入门的第一个自测点动手运行各语言实现再尝试为任意十进制数手写出定长二进制表示即可牢固掌握这一计算机底层语言。赞分享教程示例工程【免费下载链接】cosmosWorlds largest Contributor driven code dataset | Used in Quark Search Engine, OpenGenus IQ, OpenGenus Visual Project项目地址https://gitcode.com/gh_mirrors/co/cosmos点击查看免费下载相关推荐LeetCode 504. Base 7 题解Go 语言十进制转七进制的取余倒排实现LeetCode 504. Base 7 题解Go 语言十进制转七进制的取余倒排实现 导读 本文围绕 LeetCode 第 504 题「Base 7七进制数示例工程OxyPlot终极指南3步实现.NET数据可视化零基础入门OxyPlot终极指南3步实现.NET数据可视化零基础入门 你是否正在寻找一个既强大又易用的.NET图表库OxyPlot正是你需要的解决方案。作为一款跨平台数据可视化图表库LeetCode-Go 第 171 题实战Excel 列名转列序号的二十六进制还原算法Go 实现LeetCode Go 第 171 题实战Excel 列名转列序号的二十六进制还原算法Go 实现 本文基于 LeetCode Go 仓库中 171. Ex示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。