主要记录进制之间的转换,至于其他转换日后详细学习。
其中,涉及到:
StringBuffer 类
reverse();反转
60的二进制:
0000-0000 0000-0000 0000-0000 0011-1100
& 0000-0000 0000-0000 0000-0000 0000-1111=15 (注意& )(注意只计算4位)(4个1最大,就是15=1+2+4+8)
-----------------------------------------------
0000-0000 0000-0000 0000-0000 0000-1100=12=c (0是假,1是真,真真得真。)
0000-0000 0000-0000 0000-0000 0011-1100 无符号右移(>>>)4位
& 0000-0000 0000-0000 0000-0000 0000-1111=15 (注意& )(注意只计算4位)
-----------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0011=3
得出等于3c =60 2进制最多有8个4组,所以最多循环 无符号右移 8次。
自定义 查表法
0 1 2 3 4 5 6 7 8 9 A B C D E F 十六进制
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 可以把这一行看成上一行的下标。数组的方式
/**
* 用代码的方式进行进制之间的转换
*/
package ChongWuSystem;
public class Zhuanhuan {
public static void main(String [] args){
int a=-6 ;
//toBin(a);
toHex(a);
toBiao(a);
toBiao2(a);
toBinC(a);
/*试试把a定义为负数,试试。会发现,十进制转二进制报错,其他转换都没问题。
再看看十转二,再看看其他转换。得出其他方式正负值都能转换。
然后我们在把十进二改为查表法试试toBinC();
现在注释掉toBin(a);保留toBinC(a);
*/
}
//十进制转二进制
public static void toBin(int num){
StringBuffer sb=new StringBuffer();
while(num>0){
//System.out.println(a%2);
sb.append(num%2);
//用一个StringBuffer对象方法append()接收连接字符。
num=num/2;
}
System.out.print(sb+"\t得出的字符串\n");//打印字符串
System.out.print(sb.reverse()+" 正确的二进制\n");//反转打印字符串 就是我们想要的了。
}
/*十进制转换十六进制
* 回顾一下二进制转16进制,用2进制&上15就是1111,(&真真真,0假1真)
* 得出右边第一个四位数的结果,把结果进行比较,大于9则用abc表示,
* 然后把二进制无符号右移4位,&15 一直循环到该2进制结束。
*
* (char)(temp-10+'A')这个比较麻烦
*/
public static void toHex(int num){
StringBuffer sb=new StringBuffer();
for(int i=0;i<8;i++){
int temp=num&15;
if(temp>9){
//System.out.print((char)(temp-10+'A'));
sb.append((char)(temp-10+'A'));
}else{
//System.out.print(temp);
sb.append(temp);
}
num=num>>>4;
}
System.out.println(sb+" 得出的字符串");
System.out.println(sb.reverse()+" 正确的十六进制");
/*
* 先打印出结果,后使用StringBuffer对象实现字符串的连接并反转打印得出正确答案。
*/
}
/*
* 用更简单的办法来解决十六进制的转换用一个数组制作一个表,根据小标得出结果
*
*/
public static void toBiao(int num){
char [] biao={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char [] cha =new char[8];
int pos=0;
while(num!=0){//可以直观的看到用for会指定循环8次,而while只要不是0就停止。前面多余0的就不会再显示。
//for(int i=0;i<8;i++)
int temp=num&15;
//System.out.print(biao[temp]);
//cha[pos]=biao[temp];//存贮 【a】
//pos++; 【b】
cha[pos++]=biao[temp];//【a+b优化一下】
num=num>>>4;
}
//储存完毕。
//打印数组
//for(int i=cha.length-1;i>=0;i--){//为了去掉多余的空位,我们把这句改成下一句看看效果:
//for(int i=pos-1;i>=0;i--){
for(int i=0;i<cha.length;i++){
System.out.print(cha[i]+",");
}
System.out.println(" 正确的十六进制");
}
/*
* 在toBiao函数中,存入的数据是倒着的,打印的时候必须返回来打印,这里我们存入的时候就顺存入,打印的时候就顺着打
* 1是定义pos为正确的值,2是用依次减1的方式来倒着插入顺着的数组。3打印出pos对应的值,跟4比较(用画图方式比)后,我们发现不对,
* 所以注销掉1,改为5,再注销掉2,改为6,这个时候在看3,和4,就一致了。
*/
public static void toBiao2(int num){
char [] biao={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char [] cha =new char[8];
//int pos=cha.length-1;//【顺着存入数组的关键1】【1】
int pos=cha.length;//【5】
while(num!=0){//可以直观的看到用for会指定循环8次,而while只要不是0就停止。前面多余0的就不会再显示。
int temp=num&15;
//cha[pos--]=biao[temp];//【顺着存入数组的关键2】【2】
cha[--pos]=biao[temp];//【6】这个时候是7就是第八个的下标,就是倒着插入的最右边的那个元素
num=num>>>4;
}
System.out.println("pos"+pos);//【3】
//打印数组 为了去掉前面的空
for(int i=0;i<cha.length;i++){
System.out.print(cha[i]+",");
}
System.out.print("正确的十六进制\n");
for(int i=pos;i<cha.length;i++){//【4】
System.out.print(cha[i]+",");
}
System.out.print("\t最正确的十六进制最后去掉("+"“,”"+")即可");
}
/*
* 查表法-十进二
*/
public static void toBinC(int num){
char [] cha={'0','1'};
char [] arr=new char[32];
int pos=arr.length;
while(num!=0){
int temp=num&1;
arr[--pos]=cha[temp];
num=num>>>1;
}
System.out.println("\npos"+pos);
for(int i=pos;i<arr.length;i++){
System.out.print(arr[i]);
}
System.out.print("正确的");
}
//
}
---------- android培训、 java培训、期待与您交流!----------
黑马官网: http://edu.csdn.net/heima