文章目录

  • 八进制
    • 直接数值赋值
    • 来自字符串的转型
    • printf()输出八进制
    • 八进制转型String
    • 八进制总结
  • 进制转换
    • X进制转Y进制
  • 进制与位运算
    • 计算二进制数中1的个数

八进制

直接数值赋值

众所周知,数值前不加0,所以八进制数的表示要求开头加0,注意不是o或者O。
比如0123,直接赋值,对应的其实是十进制数83。

jshell> int a = 0123;
a ==> 83

来自字符串的转型

但字符串的强制转型则截然不同。
我们的数值串可能以0开头,比如下面的串"0123":

jshell> String b = "0123";
b ==> "0123"

直接转型,发现只是把0消去了而已,还是妥妥的十进制。
理由是:Integer.parseInt()默认十进制。

jshell> int c = Integer.parseInt(b);
c ==> 123

那怎么转八进制呢?显然是加上radix参数的啦,参数值就是8。

jshell> int d = Integer.parseInt(b, 8);
d ==> 83

你以为决定能转成八进制是因为b是"0123"?其实不是,任意数就可以,没必要有先导0的:

jshell> b = "123";
b ==> "123"jshell> int d = Integer.parseInt(b, 8);
d ==> 83

printf()输出八进制

这个部分该使用%0还是%o呢?

先看看%0吧!

jshell> System.out.printf("%0", a);
|  异常错误 java.util.UnknownFormatConversionException:Conversion = '0'
|        at Formatter.checkText (Formatter.java:2732)
|        at Formatter.parse (Formatter.java:2718)
|        at Formatter.format (Formatter.java:2655)
|        at PrintStream.format (PrintStream.java:1053)
|        at PrintStream.printf (PrintStream.java:949)
|        at (#4:1)

明显在扯皮……%0什么鬼啊。。。

所以要用%o,打印出的结果就是八进制的啦!(%d是十进制整数)

jshell> System.out.printf("%o", a);
123$5 ==> java.io.PrintStream@65e2dbf3jshell> System.out.printf("%o", c);
173$6 ==> java.io.PrintStream@65e2dbf3jshell> System.out.printf("%d", a);
83$7 ==> java.io.PrintStream@65e2dbf3

大O行吗?

jshell> System.out.printf("%O", c);
|  异常错误 java.util.UnknownFormatConversionException:Conversion = 'O'
|        at Formatter$FormatSpecifier.conversion (Formatter.java:2839)
|        at Formatter$FormatSpecifier.<init> (Formatter.java:2865)
|        at Formatter.parse (Formatter.java:2713)
|        at Formatter.format (Formatter.java:2655)
|        at PrintStream.format (PrintStream.java:1053)
|        at PrintStream.printf (PrintStream.java:949)
|        at (#7:1)

显然不行啊!

八进制转型String

注意前面已经定义了a的值是0123,即83。
那么同样可以使用 Integer.toString() 中的radix来破解,radix置为8即可。

jshell> String e = Integer.toString(a, 8);
e ==> "123"

结果不带先导0。

八进制总结

有关八进制的使用,大概可以这么做一下归纳:

  • 八进制用的不多,不如二进制、十进制、十六进制广泛。
  • 八进制直接赋值要加先导0,但显示出来的还是十进制的值,底层还是二进制在运算,八进制没实际意义。注意这里不是o或者O,是0。
  • 八进制使用printf()打印的时候用的是"%o",不是O或者0。
  • 将String转换成八进制数的时候,使用Integer.parseInt(),指明radix即可,结果还是十进制(显示)/二进制(底层)表示的。注意String不必加先导0。
  • 八进制数转成String的时候,使用逆向的Integer.toString(),指明radix即可,结果就是不带先导0的八进制字符串表示。

进制转换

推荐阅读:进制、进制转换和数据运算

X进制转Y进制

X进制转Y进制的一个比较笨的方法就是以十进制为桥梁, X X X进制→十进制→ Y Y Y进制。

当然,复杂的进制转化一般只有算法题才会涉及。例如洛谷 P1143 进制转换:

请你编一程序实现两种不同进制之间的数据转换。
输入数据共三行,第一行是一个正整数,表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n(2≤n≤16) n(2≤n≤16),第二行是一个n进制数,若 n > 10 n>10 n>10则用大写字母 A − F A-F A−F表示数码 10 − 15 10-15 10−15,并且该 n n n进制数对应的十进制的值不超过 1000000000 1000000000 1000000000,第三行也是一个正整数,表示转换之后的数的进制 m ( 2 ≤ m ≤ 16 ) m(2≤m≤16) m(2≤m≤16)。

实现代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int origin_radix = Integer.parseInt(scanner.nextLine());String num = scanner.nextLine();int now_radix = Integer.parseInt(scanner.nextLine());scanner.close();System.out.println(Integer.toString(Integer.parseInt(num, origin_radix), now_radix).toUpperCase());}
}

进制与位运算

计算二进制数中1的个数

推荐阅读:用位运算判断2的N次幂

public int numberOfSetBits(int n) {int result = 0;for ( ; n > 0; result++) {n &= n-1;}return result;
}

【Java】进制转换相关推荐

  1. Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)

    java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制) 这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁 想起了java中实现栈的操作十分 ...

  2. Java进制转换(二进制、八进制、十进制、十六进制)

    Java进制转换(二进制.八进制.十进制.十六进制) 1. 二进制转其它进制 二进制转八进制 String i="1001";System.out.println(Integer. ...

  3. 不怂Java进制转换(洛谷P1143题题解,Java语言描述)

    感慨 Java也能这么好使啊,不容易-- --进阶的JFarmer 题目要求 P1143题目链接 分析 进制转换其实也还好,但既然用了Java,那就得扬眉吐气一次,体会体会利用API轻松秒题的感受,机 ...

  4. java进制转换代码

    java进制转换代 定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头 需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; Sy ...

  5. Java进制转换之十六进制转八进制

    基础练习 十六进制转八进制   时间限制:1.0s   内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n&l ...

  6. JAVA 进制转换工具类 10进制转16进制 10进制转2进制 16进制转2进制 16进制10进制 2进制转10进制 2进制转16进制

    进制转换的坑: 注意:使用Integer的方法转换出来的2进制字符串 最高位是没有补零的 ,java的Integer类的toBinaryString()方法转换出来的二进制字符串只会保留最高非零位以后 ...

  7. java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!

    2进制CPU使用,8进制很少见,10进制适合人类使用,16进制适合编译器和底层程序员使用,希望对你有所帮助! 以下文章是自己从别的地方复制粘贴过来, 总结了一下. 虽然看着有点乱, 但是想学 ,就能看 ...

  8. Java进制转换原理详解

    在使用Java进行网络编程时,常常需要进行进制转换,而在进行这类操作时,往往需要对进制与Java数据类型有较深入的理解,才能确保在编程时不会出现错误.同时,深入了解进制能写出更加高效的代码. 本文先从 ...

  9. java进制转换界面,java进制转换器 图形用户界面 十进制及其相反数诀别转化为二,四,八,十六进制...

    java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制 package com.rgy.Test; import java.awt.Color; import java.aw ...

  10. Java 进制转换工具类

    /*** 进制转换工具类* @author dell**/ public class HexadecimalUtil {/*** 获得倒序二进制数据* @param hexString* @retur ...

最新文章

  1. 从 LRU Cache 带你看面试的本质
  2. 遭遇“生活天花板”,如何用 OKR 弯道超车?
  3. JavaScript基础知识(函数)
  4. php curl 内容采集
  5. LINUX安装REDIS集群
  6. 【技术综述】视频分类/行为识别研究综述,从数据集到方法
  7. 一家成立于100多年前于剑桥的科技创新公司和对我们现在的启示
  8. 用pv操作描述如下前驱图_跟我学PMP | PV、AC、EV…挣值管理的基本概念都是啥?...
  9. Win 2008 R2安装SQL Server 2008“性能计数器注册表配置单元一致性”失败的解决办法...
  10. turtle python tkinter_【案例】 什么?idle 中竟然有内置 turtle 样例?(paint)
  11. css 写打印样式问题
  12. Android编程之指定ListView的item位置
  13. V神:你所理解的“去中心化”不一定准确
  14. r语言初学者指南_由R入统:R语言统计学类书籍推荐
  15. Gargamel:信息安全取证工具
  16. 爱国者u盘linux驱动,爱国者u盘驱动
  17. 流程挖掘如何助力采购数字化转型?
  18. Macbook pro通过蓝牙连接BlackBerry拨号上网
  19. mysqloffset什么意思_MySQL中OFFSET和FETCH的详解
  20. 解读加多宝的营销案例分析 1

热门文章

  1. Linux:系统安全及应用
  2. android中bitmap压缩的几种方法详解
  3. Android中模拟点击软件的实现原理探究
  4. ListView动态刷新
  5. 关于ddk环境的配置
  6. eclipse如何写python_(怎么用eclipse写python)python eclipse 使用教程
  7. Route命令使用详解
  8. sys.stdout.flush()
  9. javascript复习资料第一部分
  10. I2C总线时序以及ACK和NACK(NAK),SCL被从机拉低?