作为一名写了多年Java的后端开发,最近在带新人时发现,很多小伙伴在处理底层协议、权限校验(如Linux权限位)或者位运算时,对进制转换依然感到头大。 以前我也会盯着二进制表硬背,或者用计算器点来点去,但现在,我的答案只有一个——掌握Java原生的进制表示法和内置转换函数,这才是高效开发的王道。
如果你也纠结过“为什么代码里的010不等于10”或者“16进制颜色值怎么转成RGB”,那这篇博客就带你彻底搞懂Java的四种进制,全程无废话,直接上干货。
一、先厘清:进制到底是个啥?
简单来说,进制就是一种计数方式。
- 十进制:就是我们的手指头,数到10就进位。
- 二进制:就像计算机里的开关,只有“开”和“关”(0和1)。
- 十六进制:相当于二进制的“缩写”,4个二进制位可以缩成1个16进制位,不仅看着整齐,写代码也省事。
比喻: 进制就像是不同规格的包装盒。二进制是小盒子(只能装1个零件),十进制是中盒子(装10个),而十六进制则是超大周转箱(装16个)。虽然盒子大小不同,但里面装的“货物”(数值大小)其实是一样的。
二、核心方案:Java中四种进制的表示法
在Java中,声明不同进制的数值,关键在于前缀。
| 二进制 | 0b 或 0B | 0, 1 | 0b1010 | 位运算、硬件交互、底层优化 |
| 八进制 | 0 (零) | 0-7 | 012 | Linux文件权限、某些老旧协议 |
| 十进制 | 无 | 0-9 | 10 | 日常业务逻辑、数量计算 |
| 十六进制 | 0x 或 0X | 0-9, A-F | 0xA | 颜色值、内存地址、加密哈希 |
三、实战操作:代码演示与转换
3.1 声明与自动转换
在Java里,无论你用哪种进制声明,打印出来默认都是十进制。
// 💻 各种进制在Java中的声明方式
public class NumberSystem {
public static void main(String[] args) {
int bin = 0b1010; // 二进制 (10)
int oct = 012; // 八进制 (10)
int dec = 10; // 十进制 (10)
int hex = 0xA; // 十六进制 (10)
// ✅ 预期输出:全是 10
System.out.println("二进制转十进制: " + bin);
System.out.println("八进制转十进制: " + oct);
System.out.println("十六进制转十进制: " + hex);
}
}
3.2 进阶:如何手动相互转换?
Java内置了强大的 Integer 工具类,帮你搞定转换逻辑。
#mermaid-svg-xMe0gSDijn3LGWfp{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xMe0gSDijn3LGWfp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xMe0gSDijn3LGWfp .error-icon{fill:#552222;}#mermaid-svg-xMe0gSDijn3LGWfp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xMe0gSDijn3LGWfp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xMe0gSDijn3LGWfp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xMe0gSDijn3LGWfp .marker.cross{stroke:#333333;}#mermaid-svg-xMe0gSDijn3LGWfp svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xMe0gSDijn3LGWfp p{margin:0;}#mermaid-svg-xMe0gSDijn3LGWfp .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-xMe0gSDijn3LGWfp .cluster-label text{fill:#333;}#mermaid-svg-xMe0gSDijn3LGWfp .cluster-label span{color:#333;}#mermaid-svg-xMe0gSDijn3LGWfp .cluster-label span p{background-color:transparent;}#mermaid-svg-xMe0gSDijn3LGWfp .label text,#mermaid-svg-xMe0gSDijn3LGWfp span{fill:#333;color:#333;}#mermaid-svg-xMe0gSDijn3LGWfp .node rect,#mermaid-svg-xMe0gSDijn3LGWfp .node circle,#mermaid-svg-xMe0gSDijn3LGWfp .node ellipse,#mermaid-svg-xMe0gSDijn3LGWfp .node polygon,#mermaid-svg-xMe0gSDijn3LGWfp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xMe0gSDijn3LGWfp .rough-node .label text,#mermaid-svg-xMe0gSDijn3LGWfp .node .label text,#mermaid-svg-xMe0gSDijn3LGWfp .image-shape .label,#mermaid-svg-xMe0gSDijn3LGWfp .icon-shape .label{text-anchor:middle;}#mermaid-svg-xMe0gSDijn3LGWfp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xMe0gSDijn3LGWfp .rough-node .label,#mermaid-svg-xMe0gSDijn3LGWfp .node .label,#mermaid-svg-xMe0gSDijn3LGWfp .image-shape .label,#mermaid-svg-xMe0gSDijn3LGWfp .icon-shape .label{text-align:center;}#mermaid-svg-xMe0gSDijn3LGWfp .node.clickable{cursor:pointer;}#mermaid-svg-xMe0gSDijn3LGWfp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xMe0gSDijn3LGWfp .arrowheadPath{fill:#333333;}#mermaid-svg-xMe0gSDijn3LGWfp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xMe0gSDijn3LGWfp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xMe0gSDijn3LGWfp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xMe0gSDijn3LGWfp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xMe0gSDijn3LGWfp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xMe0gSDijn3LGWfp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xMe0gSDijn3LGWfp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xMe0gSDijn3LGWfp .cluster text{fill:#333;}#mermaid-svg-xMe0gSDijn3LGWfp .cluster span{color:#333;}#mermaid-svg-xMe0gSDijn3LGWfp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xMe0gSDijn3LGWfp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xMe0gSDijn3LGWfp rect.text{fill:none;stroke-width:0;}#mermaid-svg-xMe0gSDijn3LGWfp .icon-shape,#mermaid-svg-xMe0gSDijn3LGWfp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xMe0gSDijn3LGWfp .icon-shape p,#mermaid-svg-xMe0gSDijn3LGWfp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xMe0gSDijn3LGWfp .icon-shape rect,#mermaid-svg-xMe0gSDijn3LGWfp .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xMe0gSDijn3LGWfp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xMe0gSDijn3LGWfp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xMe0gSDijn3LGWfp :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Integer.toBinaryString
Integer.toHexString
Integer.toOctalString
Integer.parseInt
int 整数
二进制字符串
十六进制字符串
八进制字符串
String 字符串
// 💻 进制转换实战
int num = 255;
// 1. 十进制转其他 (返回String)
String binStr = Integer.toBinaryString(num); // "11111111"
String hexStr = Integer.toHexString(num); // "ff"
// 2. 其他进制转十进制 (利用 parseInt)
// 🔴 注意:这里不需要加 0b 或 0x 前缀,但要指定基数(Radix)
int fromBin = Integer.parseInt("11111111", 2);
int fromHex = Integer.parseInt("FF", 16);
System.out.println("255的十六进制是: " + hexStr); // 💡 预期输出:ff
四、生产级优化:避坑指南与进阶技巧
4.1 🔴 避坑提醒:消失的“0”
很多新手在写代码时为了对齐,喜欢在数字前加个0,比如: int count = 010; 注意:在Java眼中,这不再是10,而是八进制的8!这会导致非常隐蔽的Bug。
结论:除非你真的要用八进制,否则严禁数值以0开头。
4.2 💡 进阶技巧:数字下划线
如果你写二进制或十六进制太长,看得眼花,可以使用Java 7引入的下划线功能: int largeBin = 0b1101_1010_0011_1111; 这仅仅是为了增加可读性,编译器会自动忽略它。
4.3 性能对比
| 速度 | 快 | 极快(直接操作寄存器) |
| 可读性 | 极佳 | 较差(需注释配合) |
| 场景 | 90%的业务代码 | 权限控制、状态压缩、高并发优化 |
本章小结
| 进制前缀 | 记准 0b(二)、0(八)、0x(十六) |
| 进制转换 | 掌握 Integer.to…String() 和 parseInt() |
| 避坑指南 | 绝不随意在数字前补 0 |
五、总结:你的行动清单
通过本文,你应该已经掌握了Java进制的核心用法。与其死记硬背公式,不如记住这套**“工具类+前缀”**的组合拳。
验证清单(实操后必查)
- ⭐ [ ] 能够通过前缀一眼分辨出四种进制
- ⭐ [ ] 能够使用 Integer 类完成十进制与十六进制的转换
- 检查代码中是否有误用的八进制(即 0 开头的数字)
- 尝试在长数字中使用 _ 下划线提高代码美感
希望这篇博客能帮助你扫清Java进制的障碍。如果你在实际开发中遇到过奇怪的进制Bug,或者有更好用的转换技巧,欢迎在评论区留言交流~

