黑马程序员_Java基础[6]_进制转换

时间:2023-02-19 13:28:16
---------- android培训 java培训、期待与您交流! ----------

主要记录进制之间的转换,至于其他转换日后详细学习。

其中,涉及到:

StringBuffer 类


     append();追加?在c#中该方法是追加字符串用的,

      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