一、十六进制转八进制
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
1.读一个字符串:String s = sc.next();
2.类StringBuffer
一个类似于 String 的字符串缓冲区,但不能修改。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容为 “start” 的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含 “startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之包含 “starlet”。
3.char charAt(int index)返回指定索引处的 char 值。
4.String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。(beginIndex ~ endindex-1)
5.boolean equals(Object anObject) 将此字符串与指定的对象比较。
import java.util.Scanner;
public class Jinzhi1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
int n=s.nextInt();
String[] a=new String[n];
for(int i=0;i<n;i++){
a[i]=s.next();
}
for(int i=0;i<n;i++){
String s1=erjinzhi(a[i]); //调用把十六进制转化为二进制的函数
int len=s1.length(); //转化为二进制后的长度
if(len%3==1) s1="00"+s1; //八进制是三个二进制一组,模三,不是三的整数倍的在前面补零
else if(len%3==2) s1="0"+s1;
String s2=bajinzhi(s1); //调用把二进制转化为八进制的函数
System.out.println(s2);
}
}
public static String erjinzhi(String s){ //十六进制转化为二进制函数
StringBuffer sBuffer=new StringBuffer();
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='0') sBuffer.append("0000"); //千万注意这里用的是双引号
else if(s.charAt(i)=='1') sBuffer.append("0001");
else if(s.charAt(i)=='2') sBuffer.append("0010");
else if(s.charAt(i)=='3') sBuffer.append("0011");
else if(s.charAt(i)=='4') sBuffer.append("0100");
else if(s.charAt(i)=='5') sBuffer.append("0101");
else if(s.charAt(i)=='6') sBuffer.append("0110");
else if(s.charAt(i)=='7') sBuffer.append("0111");
else if(s.charAt(i)=='8') sBuffer.append("1000");
else if(s.charAt(i)=='9') sBuffer.append("1001");
else if(s.charAt(i)=='A') sBuffer.append("1010");
else if(s.charAt(i)=='B') sBuffer.append("1011");
else if(s.charAt(i)=='C') sBuffer.append("1100");
else if(s.charAt(i)=='D') sBuffer.append("1101");
else if(s.charAt(i)=='E') sBuffer.append("1110");
else if(s.charAt(i)=='F') sBuffer.append("1111");
}
return sBuffer.toString(); //函数返回String类型,不是StringBuffer类型
}
public static String bajinzhi(String s){ //二进制转化为八进制
int len=s.length();
int k;
StringBuffer sBuffer=new StringBuffer();
if(s.substring(0, 3).equals("000")) k=3; //看看前三位是否为0,若为零则从第四位开始
else k=0;
for(int i=k;i<len-2;i+=3){ //i从k开始遍历
if(s.substring(i,i+3).equals("000")) sBuffer.append("0");
else if(s.substring(i,i+3).equals("001")) sBuffer.append("1");
else if(s.substring(i,i+3).equals("010")) sBuffer.append("2");
else if(s.substring(i,i+3).equals("011")) sBuffer.append("3");
else if(s.substring(i,i+3).equals("100")) sBuffer.append("4");
else if(s.substring(i,i+3).equals("101")) sBuffer.append("5");
else if(s.substring(i,i+3).equals("110")) sBuffer.append("6");
else if(s.substring(i,i+3).equals("111")) sBuffer.append("7");
}
return sBuffer.toString();
}
}
二、十六进制转十进制
static Long valueOf(String s, int radix)当使用第二个参数给出的基数进行解析时,返回保持从指定 String 中提取的值的 Long 对象
由于Java中没有格式化输入,只能把给定的十六进制数读取当做一个字符串读取到一个字符串变量中,然后通过Java中自带的进制转换函数将读取的十六进制数转换成十进制数输出。
使用Java特性的的Long.valueOf(String s, int radix) 方法,注意这块需要Long,因为Int的范围已经不够了。
当字符串变量s为一串r进制数字序列时,可以利用Integer.valueOf(s,r)函数将其转换为十进制int型整数,利用Long.valueOf(s,r)函数将其转换为十进制long型整数。
package Lanqiao;
import java.util.Scanner;
public class Jinzhi2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
String s1=s.next();
System.out.println(Long.valueOf(s1,16));
}
}
三、01字串
问题描述:对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。(应该就是把十进制转化为二进制…可以直接输出,但是要写32条输出语句,也可以写5个嵌套的for循环,所以不如…)
static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<32;i++){
String s=Integer.toBinaryString(i); //在Integer类里
while(s.length()!=5){ //长度为5位
s="0"+s;
}
System.out.println(s);
}
}
}