【ShuQiHere】 进制转换的世界:从十进制到二进制、十六进制的转换技巧

【ShuQiHere】

在计算机科学中,进制转换(Radix Conversion) 是一个基础且非常重要的技能。无论是理解计算机的存储、数据表示,还是在编程中处理不同的进制数据,进制转换都是不可或缺的。本文将详细讲解 十进制(Decimal, 10进制)二进制(Binary, 2进制)十六进制(Hexadecimal, 16进制) 之间的转换,帮助你扎实掌握这些技巧,并通过丰富的例子加深理解。🧠

什么是进制?🧮

进制是表示数字的方式。每种进制都有其基数(Base),表示该进制每一位数字可以取的值的范围。常见的进制有:

  • 十进制(Decimal, base-10):我们日常使用的数字系统,基数为10,使用的符号是0-9。
  • 二进制(Binary, base-2):计算机底层使用的数字系统,基数为2,符号是0和1。🖥️
  • 十六进制(Hexadecimal, base-16):常用于计算机系统,基数为16,符号是0-9和A-F,其中A表示10,B表示11,依此类推,直到F表示15。💡

进制的实际应用

  • 二进制(Binary, 2进制) 是计算机中最底层的数据表示方式,计算机存储和处理的数据都是以二进制形式存储的。
  • 十六进制(Hexadecimal, 16进制) 通常用于简化二进制表示。一个十六进制数字可以表示四位二进制数字(4 bits),因此它在表示内存地址和机器码时非常方便。

现在让我们通过更详细的例子来深入理解不同进制之间的转换!🚀


1. 十进制转二进制(Decimal to Binary, 10-2) ⚙️

十进制转二进制通常使用 除2取余法。这个方法的核心是不断将十进制数除以2,记录每次除法的余数,直到商为0。最后,将余数逆序排列得到二进制数。

步骤:

  1. 将十进制数不断除以 2,并记录每次的余数。
  2. 将余数从最后一次除法结果开始反向排列,得到最终的二进制结果。

示例:

59 转换为二进制:

  1. 59 ÷ 2 = 29,余数 1
  2. 29 ÷ 2 = 14,余数 1
  3. 14 ÷ 2 = 7,余数 0
  4. 7 ÷ 2 = 3,余数 1
  5. 3 ÷ 2 = 1,余数 1
  6. 1 ÷ 2 = 0,余数 1

将余数逆序排列得到:
59_{10} = 111011_2

背景知识:

在计算机存储中,二进制 是最基础的表示方式。每个二进制位(bit)表示一个最小存储单元,且每一位只有两种可能的状态:0 或 1。

Java代码手动实现:

public class DecimalToBinaryManual {public static String decimalToBinary(int n) {StringBuilder binaryNum = new StringBuilder();while (n > 0) {binaryNum.append(n % 2);n = n / 2;}return binaryNum.reverse().toString();}public static void main(String[] args) {System.out.println(decimalToBinary(59));  // 输出: 111011}
}

2. 十进制转十六进制(Decimal to Hexadecimal, 10-16) 🔢

将十进制数转换为十六进制可以使用 除16取余法。通过不断将十进制数除以16并记录余数,最后将余数逆序排列即可得到十六进制数。

步骤:

  1. 将十进制数不断除以 16,并记录每次的余数。
  2. 余数部分对应十六进制的符号:0-9 对应本身,10-15 对应 A-F
  3. 将余数逆序排列,得到最终的十六进制数。

示例:

1234 转换为十六进制:

  1. 1234 ÷ 16 = 77,余数 2
  2. 77 ÷ 16 = 4,余数 13 (对应十六进制的 D
  3. 4 ÷ 16 = 0,余数 4

将余数逆序排列,得到:
1234_{10} = 4D2_{16}

背景知识:

十六进制 通常用来简化二进制表示,因为一个十六进制数字正好可以表示四个二进制位。计算机中很多底层信息,如内存地址、颜色代码等,都是通过十六进制来表示的。

Java代码手动实现:

public class DecimalToHexadecimalManual {public static String decimalToHexadecimal(int n) {StringBuilder hexNum = new StringBuilder();char[] hexDigits = "0123456789ABCDEF".toCharArray();while (n > 0) {hexNum.append(hexDigits[n % 16]);n = n / 16;}return hexNum.reverse().toString();}public static void main(String[] args) {System.out.println(decimalToHexadecimal(1234));  // 输出: 4D2}
}

3. 十六进制转十进制(Hexadecimal to Decimal, 16-10) 🖥️

要将 十六进制 转换为 十进制,我们使用 权值展开法。将每一位十六进制数乘以16的相应幂次,再将结果相加得到十进制数。

步骤:

  1. 从右向左,每一位乘以 (16) 的相应幂次。
  2. 将结果相加,得到十进制数。

示例:

1A3F_{16} 转换为十进制:

[
1 A 3 F 16 = ( 1 × 1 6 3 ) + ( 10 × 1 6 2 ) + ( 3 × 1 6 1 ) + ( 15 × 1 6 0 ) = 4096 + 2560 + 48 + 15 = 671 9 10 1A3F_{16} = (1 \times 16^3) + (10 \times 16^2) + (3 \times 16^1) + (15 \times 16^0) = 4096 + 2560 + 48 + 15 = 6719_{10} 1A3F16=(1×163)+(10×162)+(3×161)+(15×160)=4096+2560+48+15=671910
]

背景知识:

十六进制的每一位代表的权重是 (16^n),这使得它非常适合表示较大的数,同时可以减少书写的长度。内存地址、汇编语言中的指令都是用十六进制表示的。

Java代码手动实现:

public class HexadecimalToDecimalManual {public static int hexadecimalToDecimal(String hexNum) {int decimal = 0;int base = 1; // 16^0char[] hexDigits = hexNum.toUpperCase().toCharArray();int len = hexDigits.length;for (int i = len - 1; i >= 0; i--) {if (hexDigits[i] >= '0' && hexDigits[i] <= '9') {decimal += (hexDigits[i] - '0') * base;} else if (hexDigits[i] >= 'A' && hexDigits[i] <= 'F') {decimal += (hexDigits[i] - 'A' + 10) * base;}base *= 16;}return decimal;}public static void main(String[] args) {System.out.println(hexadecimalToDecimal("1A3F"));  // 输出: 6719}
}

4. 十六进制转二进制(Hexadecimal to Binary, 16-2) 🧑‍💻

十六进制转二进制 非常简单。每一个十六进制数字对应四位二进制数。只需将每位十六进制数字分别转换成四位二进制数,最后将它们拼接起来。

步骤:

  1. 将每一个十六进制位转换为对应的四位二进制数。
  2. 将这些二进制数拼接在一起

,得到最终的二进制结果。

示例:

1A3F_{16} 转换为二进制:

  • 1 = 0001
  • A = 1010
  • 3 = 0011
  • F = 1111

所以:
1A3F_{16} = 0001\ 1010\ 0011\ 1111_2

背景知识:

二进制与十六进制之间的转换非常简便,尤其在处理大型的二进制数据时,十六进制能帮助我们更轻松地表示和阅读数据。许多程序员在调试时经常用到十六进制,因为它可以让复杂的二进制变得更加清晰易读。

Java代码手动实现:

public class HexadecimalToBinaryManual {public static String hexadecimalToBinary(String hexNum) {StringBuilder binary = new StringBuilder();char[] hexDigits = hexNum.toUpperCase().toCharArray();for (char hexDigit : hexDigits) {switch (hexDigit) {case '0': binary.append("0000"); break;case '1': binary.append("0001"); break;case '2': binary.append("0010"); break;case '3': binary.append("0011"); break;case '4': binary.append("0100"); break;case '5': binary.append("0101"); break;case '6': binary.append("0110"); break;case '7': binary.append("0111"); break;case '8': binary.append("1000"); break;case '9': binary.append("1001"); break;case 'A': binary.append("1010"); break;case 'B': binary.append("1011"); break;case 'C': binary.append("1100"); break;case 'D': binary.append("1101"); break;case 'E': binary.append("1110"); break;case 'F': binary.append("1111"); break;}}return binary.toString();}public static void main(String[] args) {System.out.println(hexadecimalToBinary("1A3F"));  // 输出: 0001101000111111}
}

5. 二进制转十进制(Binary to Decimal, 2-10) 💡

二进制 转换为 十进制 可以使用 权值展开法。二进制的每一位表示 2 的幂次方,通过计算每一位二进制对应的十进制值,并将这些值相加得到最终的十进制结果。

步骤:

  1. 将每个二进制位乘以 2 的幂次方。
  2. 将结果相加,得到十进制数。

示例:

1101101_2 转换为十进制:

[
110110 1 2 = ( 1 × 2 6 ) + ( 1 × 2 5 ) + ( 0 × 2 4 ) + ( 1 × 2 3 ) + ( 1 × 2 2 ) + ( 0 × 2 1 ) + ( 1 × 2 0 ) = 64 + 32 + 0 + 8 + 4 + 0 + 1 = 10 9 10 1101101_2 = (1 \times 2^6) + (1 \times 2^5) + (0 \times 2^4) + (1 \times 2^3) + (1 \times 2^2) + (0 \times 2^1) + (1 \times 2^0) = 64 + 32 + 0 + 8 + 4 + 0 + 1 = 109_{10} 11011012=(1×26)+(1×25)+(0×24)+(1×23)+(1×22)+(0×21)+(1×20)=64+32+0+8+4+0+1=10910
]

背景知识:

二进制 是计算机唯一能直接理解的数字系统。每一个二进制位(bit)都代表一个最小的存储单元,而它的值只能是 0 或 1。

Java代码手动实现:

public class BinaryToDecimalManual {public static int binaryToDecimal(String binaryNum) {int decimal = 0;int base = 1; // 2^0int len = binaryNum.length();for (int i = len - 1; i >= 0; i--) {if (binaryNum.charAt(i) == '1') {decimal += base;}base *= 2;}return decimal;}public static void main(String[] args) {System.out.println(binaryToDecimal("1101101"));  // 输出: 109}
}

6. 二进制转十六进制(Binary to Hexadecimal, 2-16) 🔄

二进制转十六进制 的转换方法非常简单,只需将二进制数每四位一组,转换为对应的十六进制数即可。

步骤:

  1. 将二进制数从右往左按四位分组。
  2. 将每组二进制数转换为对应的十六进制数。

示例:

1101101011_2 转换为十六进制:

  1. 从右向左分组:11011011
  2. 转换:
    • 1101 = D
    • 1011 = B

所以:
1101101011_2 = 1DB_{16}

背景知识:

二进制十六进制 之间的转换在计算机系统中非常常见。二进制数非常冗长且不易阅读,而十六进制数能简化表示,同时能保留二进制信息的精确度。

Java代码手动实现:

public class BinaryToHexadecimalManual {public static String binaryToHexadecimal(String binaryNum) {StringBuilder hex = new StringBuilder();int len = binaryNum.length();// 补齐长度为4的倍数while (len % 4 != 0) {binaryNum = "0" + binaryNum;len++;}for (int i = 0; i < len; i += 4) {String fourBits = binaryNum.substring(i, i + 4);switch (fourBits) {case "0000": hex.append("0"); break;case "0001": hex.append("1"); break;case "0010": hex.append("2"); break;case "0011": hex.append("3"); break;case "0100": hex.append("4"); break;case "0101": hex.append("5"); break;case "0110": hex.append("6"); break;case "0111": hex.append("7"); break;case "1000": hex.append("8"); break;case "1001": hex.append("9"); break;case "1010": hex.append("A"); break;case "1011": hex.append("B"); break;case "1100": hex.append("C"); break;case "1101": hex.append("D"); break;case "1110": hex.append("E"); break;case "1111": hex.append("F"); break;}}return hex.toString();}public static void main(String[] args) {System.out.println(binaryToHexadecimal("1101101011"));  // 输出: 1DB}
}

总结 🎯

在这篇博客中,我们通过丰富的例子讲解了六种常见的进制转换方式:从 十进制到二进制十进制到十六进制,再到 二进制、十六进制与十进制之间的转换。掌握这些进制转换技巧不仅有助于理解计算机底层数据的表示,还能帮助你在编程和调试中更加得心应手。

  • 十进制转二进制(10-2):除2取余法
  • 十进制转十六进制(10-16):除16取余法
  • 十六进制转十进制(16-10):权值展开法
  • 十六进制转二进制(16-2):每位对应四位二进制
  • 二进制转十进制(2-10):权值展开法
  • 二进制转十六进制(2-16):每四位二进制对应一位十六进制

进制转换是每个计算机组成原理课程的基础内容,它不仅帮助我们理解计算机如何存储和处理数据,还在编程和系统开发中有着广泛的应用。希望本文能够帮助你深入理解这些关键概念,成为进制转换的高手!💻✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427434.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JS】postMessage与MessageChannel

前言 postMessage 和 MessageChannel 都是用来实现跨文档、跨窗口或跨线程&#xff08;Web Worker&#xff09;的消息传递机制。 postMessage 可以在 iframe、同源或跨源窗口之间传递数据&#xff0c;也可以用于主线程与 Web Worker 之间的通信。 postMessage 是一种单向的…

数据结构-3.1.栈的基本概念

一.栈的定义&#xff1a; 栈和线性表的区别&#xff1a;栈只能在表尾一端进行插入或者删除的操作&#xff0c;而线性表可以在任意一个地方进行插入或者删除 二.有关栈的关键术语&#xff1a; 三.栈的基本操作&#xff1a; 1.回顾线性表的基本操作&#xff1a; 2.栈的基本操作&…

佰朔资本:国内海风加速招标 船舶行业景气上行

昨日&#xff0c;沪指盘中一度下探失守2700点&#xff0c;尾盘在地产、银行等板块的带动下发力上扬&#xff0c;深证成指亦翻红。到收盘&#xff0c;沪指涨0.49%报2717.28点&#xff0c;深证成指涨0.11%报7992.25点&#xff0c;创业板指跌0.11%报1533.47点&#xff0c;上证50指…

商业终端架构技术-未来之窗行业应用跨平台架构

未来之窗行业应用跨平台架构 以下是对未来之窗行业应用跨平台架构中客户端的稳定优势和网页跨平台性质的扩展列举&#xff1a; 一、客户端的稳定优势&#xff1a; 1. 离线可用性 - 即使在没有网络连接的…

如何将MySQL卸载干净(win11)

相信点进来的你肯定是遇到了这个问题&#xff0c;那就是在安装MySQL的时候操作错误&#xff0c;最后结果不是自己想要的。卸载重新安装又发现安装不了。其实最主要的原因就是没有将MySQL卸载干净&#xff0c;那么如何把MySQL卸载干净&#xff1f;下面本篇文章就来给大家一步步介…

Tiny-universe 1:Qwen整体介绍Qwen-blog

Qwen模型架构讲解直播&#xff1a;直播链接 Qwen的整体架构与Llama2类似&#xff0c;如下图所示: 其中: tokenizer将文本转为词表里面的数值。数值经过embedding得到一一对应的向量。attention_mask是用来看见左边、右边&#xff0c;双向等等来设定。各类下游任务&#xff0…

Kafka集群扩容(新增一台kafka节点)

kafka集群扩容、kafka topic迁移 现有环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3 扩容之后环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3192.168.17.54ka…

InternVL 微调实践闯关任务

基础任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图. 尝试使用LoRA&#xff0c;或调整xtuner的config&#xff0c;如LoRA rank&#xff0c;学习率。看模型Loss会如何变化&#xff0c;并记录调整后效果(选做&#xff…

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1&#xff1a;不同模型变体在 AmazonClothing 数据集上的初步研究图 2&#xff1a;CKD模型架构的说明图 3&#xff1a;在 Amazon-Clothing 数据集上训练过…

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上&#xff0c;加上事件结构&#xff0c;实现单击一次按…

后端接收数组,集合类数据

文章目录 一. 请求行Path参数&#xff08;不建议&#xff09;二.数组接收&#xff08;不建议&#xff09;三.List集合接收&#xff08;建议&#xff09;四. GET请求既包含请求体又包含请求行 一. 请求行Path参数&#xff08;不建议&#xff09; DeleteMapping("/{ids}&quo…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢&#xff1f;为什么Redis Cluster哈希槽数量是16384&#xff1f; 关键词&#xff1a;一致性 Hash&#xff0c;哈希槽&#xff0c; 带着…

iOS 巨魔神器,Geranium 天竺葵:6大功能,个个都解决痛点

嘿&#xff0c;这是黑猫。如果你装了巨魔&#xff0c;却只知道安装第三方APP&#xff0c;那就是暴殄天物。巨魔的价值不仅是应用侧载&#xff0c;还有强大的玩机工具生态——这也是我花费大量时间&#xff0c;去制作巨魔精选IPA合集的原因。 通过巨魔商店安装的APP&#xff0c…

SQL优化-MySQL Explain中出现Select tables optimized away

文章目录 前言相关解释总结 前言 今天在做SQL优化的时候&#xff0c;在使用explain执行SQL时&#xff0c;出现了以下情况&#xff1a; EXPLAIN SELECT m1.id from station m1 INNER JOIN site s ON m1.codes.stationcode where receivetime(SELECT MAX(m2.receivetime) FROM…

Python爱心射线(完整代码)

目录 系列目录 写在前面​ 完整代码 下载代码 代码分析 写在后面 系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3

springsecurity+jwt实现前后端分离认证授权

文章目录 1.简介2.快速入门3.认证3.1登录校验流程3.2原理初探3.3认证详流程详解3.4 分析UsernamePasswordAuthenticationFilter 4.案例实战4.1 思路分析4.2准备工作4.3实战1.数据库校验用户2.核心代码1.创建UserDetailsService实现类2.创建UserDetails实现类3.密码加密存储模式…

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载&#xff1a; 先去clickhouse官网进行下载&#xff0c;继续往下翻找文档&#xff0c;将DBeaver也下载下来 下载地址&#xff1a;https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…

Linux文件IO(一)-open使用详解

在 Linux 系统中要操作一个文件&#xff0c;需要先打开该文件&#xff0c;得到文件描述符&#xff0c;然后再对文件进行相应的读写操作&#xff08;或其他操作&#xff09;&#xff0c;最后在关闭该文件&#xff1b;open 函数用于打开文件&#xff0c;当然除了打开已经存在的文…

优化算法(四)—蚁群算法(附MATLAB程序)

蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟蚂蚁觅食行为的优化算法&#xff0c;由Marco Dorigo于1990年提出。它利用了蚂蚁在寻找食物的过程中通过释放信息素来相互影响的机制&#xff0c;以找到最优解或接近最优解。蚁群算法特别适用于解决组合…

【高级编程】网络编程 基于 TCPUDP 协议的 Socket 编程

文章目录 IP地址Socket基于 TCP 协议的 Socket 编程基于 UDP 协议的 Socket 编程 IP地址 IP地址&#xff08;Internet Protocol&#xff09;&#xff1a;唯一标识网络上的每一台计算机 IP地址的组成&#xff1a;32位&#xff0c;由4个8位二进制数组成 11000000.10101000.000…