当前位置: 首页 > news >正文

Java的进制转换

进制知识

Java 中使用不同的前缀表示数据,常见的进制数据有二进制(0b)、八进制(0)、十进制(无)、十六进制(0x)。

public class Demo1 {public static void main(String[] args) {int n1 = 0b1010; // 二进制int n2 = 01010; // 八进制int n3 = 1010; // 十进制int n4 = 0x1010; // 十六进制//-------------------------- 以下输出的是10进制,具体转化规则后面说明System.out.println(n1); // 10System.out.println(n2); // 520System.out.println(n3); // 1010System.out.println(n4); // 4112}
}

一、其他进制转十进制

  1. 二进制 转 十进制:从最低位(右边)开始,将每个位上的数提取出来,乘以 2 的(位数 - 1)次方,然后求和。

    案例:请将 0b1011 转化为十进制
    计算:0b1011 = 1 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 1 * 2 ^ 3 = 1 + 2 + 0 + 8 = 11
    
  2. 八进制 转 十进制: 从最低位(右边)开始,将每个位上的数提取出来,乘以 8 的(位数 - 1)次方,然后求和。

    案例:请将 0234 转化为十进制
    计算:0234 = 4 * 8 ^ 0 + 3 * 8 ^ 1 + 2 * 8 ^ 2 + 0 * 8 ^ 3  = 4 + 24 + 128 = 156
    
  3. 十六进制 转 十进制:从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数 - 1)次方,然后求和。

    案例:请将 0x23A =  转化为十进制,A = 10、B = 11、.... 、G = 16
    计算:0x23A = 10 * 16 ^ 0 + 3 * 16 ^ 1 + 2 * 16 ^ 2 = 10 + 48 + 512 = 570 
    

二、十进制转其他进制

  1. 十进制 转 二进制:将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数排列好后倒置(补全四位一组)就是对应的二进制结果。

    案例:请将 34 转化为二进制 => 0b 0010 0010
    计算:34/2 = 17 ... 0,17/2 = 8 ... 1,8/2 = 4 ... 0,4/2 = 2 ... 0, 2/2 = 1 ... 0,1/2 = 0 ... 1;得到 01 0001 => 10 0010(倒置)=> 0B 0010 0010(补全四位一组)
    
  2. 十进制 转 八进制:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数排列好后倒置就是对应的八进制。

    案例:请将 131 转化为八进制 => 0203 
    计算:131/8 = 16 ... 3,16/8 = 2 ... 0,2/8 = 0 ... 2,得到 302 => 203(倒置) => 0 203
    
  3. 十进制 转 十六进制:将该数不断除以16,直到商为0为止,然后将每步得到的余数到过来,就是对应的十六进制。

    案例:请将 237 转化为十六进制 => 0xED
    计算:237/16 = 14 ... 13,14/16 = 0 ... 14,得到 1314 => DE(转化) => ED(倒置) => 0x ED
    

三、混合进制转换

  1. 二进制 转 八进制:从低位开始(右),将二进制数划分为每三位一组,再将每组转化为对应的十进制数,然后按顺序排列后倒置过来就是需要转化的八进制数。

    案例:请将 0b 11010101 转化为八进制
    计算:101 => 5,010 => 2,011(左补0) => 3,得到523 => 325(倒置) => 0 325 
    
  2. 二进制 转 十六进制:从低位开始(右),将二进制数划分为每四位一组,再将每组转化为对应的十进制数,然后按顺序排列后倒置过来就是需要转化的十六进制数。

    案例:请将 0b 11010101 转化为八进制
    计算:0101 => 5,1101 => 13,得到5 13 => 5D => D5(倒置) => 0x D5 
    
  3. 八进制 转 二进制:将八进制数的每 1 位,转化为对应的一个 3 位的二进制数即可。

    案例:请将 0 237 转化为二进制
    计算:2 => 010,3 => 011,7 => 111,得到 010 011 111 => 010011111 => 0b 010011111
    
  4. 十六进制 转 二进制:将八进制数的每 1 位,转化为对应的一个 4 位的二进制数即可。

    案例:请将 0x 23B 转化为二进制
    计算:2 => 0010(左补0), 3 => 0011(左补0), B => 1011,得到 0010 0011 1011 => ob 0010 0011 1011
    
  5. 十六进制 转 八进制 或 八进制 转 十六进制 *:将十六进制数转换为八进制数是不太直接的,因为十六进制和八进制之间没有直接的一一对应关系,而且它们的位数也不一致。十六进制和八进制虽然都是一种进制表示法,但它们的基数(每位的权值)不同。十六进制的基数是 16,八进制的基数是 8。因此,如果要将十六进制数直接转换为八进制数,需要经过十进制的中间转换。

    假设要将十六进制数 2A 转换为八进制数:
    1. 将十六进制数 2A 转换为十进制数:(2 * 16^1) + (10 * 16^0) = 42
    2. 将十进制数 42 转换为八进制数:(42) / 8 = 5 ... 2,余数为 6, 继续除以 6 / 8,得到 6,余数为 0, 因此,十六进制数 2A 转换为八进制数为 26 => 倒过来 => 62。
    

四、原码、反码、补码

原码:将一个整数转换成二进制形式,就是其原码。例如 short a = 6,a 的原码就是 0000 0000 0000 0110;更改 a 的值 a = -18,那 a 的原码就是 1000 0000 0001 0010。通俗的理解,原码就是一个整数本来的二进制形式。此外,二进制最高位是符号位,0 表示正数,1 表示负数

  • 6 => 0000 0000 0000 0110 => 0(符号位) 000 0000 0000 0110
  • -18 => 1000 0000 0001 0010 => 1(符号位) 000 0000 0001 0010

反码:对于正数,它的反码就是其原码(原码和反码相同),负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是0变成 1,1 变成 0。例如 short a = 6,a 的原码和反码都是 0000 0000 0000 0110;更改 a 的值 a = -18,a的反码是 1111 1111 1110 1101。

  • 6 => 0000 0000 0000 0110 => 0(符号位)000 0000 0000 0110
  • -18 => 1000 0000 0001 0010 = 1(符号位)111 1111 1110 1101。

补码:对于正数,它的补码就是其原码(原码、反码、补码都相同),负数的补码是其反码加 1。例如 short a = 6,a 的原码、反码、补码都是 0000 0000 0000 0110;更改 a 的值 a = -18,a 的补码是 1111 1111 1110 1110。可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。

  • 6 => 0000 0000 0000 0110 => 0(符号位)000 0000 0000 0110
  • -18 => 1000 0000 0001 0010 => 1(符号位)111 1111 1110 1101 => 1(符号位)111 1111 1110 1110

注意,原码、反码、补码的概念只对负数有实际意义,对于正数,原码、反码、补码都是一样。

在线转化工具:https://www.lddgo.net/convert/number-binary-code

FAQ:为啥十进制转化二进制一般补全 16 / 8 位?

在计算机科学中,十进制数转换为二进制数时,可能会补全位数,常见的有补全为 8 位、16 位或更多位。这样做的目的是为了在固定位数下表示和存储数字,保证数据的一致性和可比较性。以下是一些原因:

  1. 固定数据长度: 在计算机系统中,存储器单元的长度是固定的,通常以字节(byte)为单位。通过使用固定位数来表示数字,可以确保数据在存储和传输过程中不会发生变化。
  2. 对齐和效率: 许多计算机体系结构在内存中访问数据时需要对齐。通过将数字转换为固定位数的二进制表示,可以提高内存访问的效率。此外,固定长度的数据在处理和传输时通常更高效。
  3. 数据比较: 在某些情况下,需要对数字进行比较。使用固定位数的表示可以确保比较的准确性,而不会受到位数不同的影响。
  4. 数据存储和传输: 在通信和存储中,使用固定位数的数据表示可以减少数据传输的大小,节省带宽和存储空间。
  5. 编程的一致性: 使用固定位数的数据表示可以使编程更一致和可预测。例如,如果操作系统或硬件要求固定长度的数据,那么程序员可以始终使用相同的位数进行编程,而不必考虑不同长度数据可能引起的问题。

补全 16 位或其他位数的做法,实际上是为了满足特定需求并保持数据的一致性和可预测性。在不同的上下文中,可能会选择不同的位数来表示数字,具体取决于所涉及的应用和系统。


The end.

相关文章:

  • 通义灵码 - HTML智能编码辅助AI工具
  • OrangePi Zero 3学习笔记(Android篇)8 - OpenOCD
  • 1.6 关于static和final的修饰符
  • 全景系统监控利器:Glances 使用介绍与实战指南
  • 采用AI神经网络降噪算法的语言降噪消回音处理芯片NR2049-P
  • 【Linux】进程通信 管道
  • Redis——线程模型·
  • STB仿真和放大器开环AC仿真有什么区别
  • 解锁城市排水系统设计与二次开发的钥匙-SWMM复杂城市排水系统模型及排水防涝、海绵城市设计等工程实践应用
  • 二分查找算法的思路
  • 丝杆升降机限位开关信号解析与应用实践:从原理到代码实现
  • 后量子密码通信协议测试指南
  • Lighthouse Core Web Vitals 指标详解与优化指南
  • 深入浅出之STL源码分析8_三个指针
  • 操作系统:内存管理
  • 虚拟机中kali代理设置
  • Glowroot安装使用第一期
  • Java 反射机制(Reflection)
  • AD19基础应用技巧:Via 尺寸设置界面 (Size and Shape)
  • R-Studio:高效电脑数据恢复神器
  • 美国4月CPI同比上涨2.3%低于预期,为2021年2月来最小涨幅
  • 习近平出席中拉论坛第四届部长级会议开幕式并发表主旨讲话
  • 演员黄晓明、金世佳进入上海戏剧学院2025年博士研究生复试名单
  • 网信部门曝光网络谣言典型案例,“AI预测彩票号码百分百中奖”等在列
  • 中美经贸高层会谈11日在日内瓦将继续进行
  • 非洲雕刻艺术有着怎样的“变形之美”