欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

10进制转换为2进制和16进制

程序员文章站 2024-03-16 23:01:16
...
public class Main4{

	
	
	public static void main(String[] args)
	{
		Main4 solution = new Main4();
		// "0000000000001111,000F"
		System.out.println(solution.changeFormatNumber("15"));
		// "1111111111111111,FFFF"
		System.out.println(solution.changeFormatNumber("-1"));
		
		int num=(int)Math.pow(2, 15)-1;
		System.out.println(num);
		System.out.println(solution.changeFormatNumber(String.valueOf(num)));
		
		num=-(int)Math.pow(2, 15);
		System.out.println(num);
		System.out.println(solution.changeFormatNumber(String.valueOf(num)));
		
		num=(int)Math.pow(2, 15)+3;
		System.out.println(num);
		System.out.println(solution.changeFormatNumber(String.valueOf(num)));
		
		System.out.println(solution.changeFormatNumber("abc"));
	}
	
	
	/**
     * 将输入的十进制数字转换为对应的二进制字符串和十六进制字符串
     * @param number string字符串 十进制数字字符串
     * @return string字符串
     */
    public String changeFormatNumber (String number) {
    	try
		{
    		char[] chars=new char[16];
        	// 先都转为正数 num
        	int num = 0;
        	boolean isPlus = true; 
        	if(number.charAt(0)=='-'){
        		isPlus=false;
        		number=number.substring(1);    		
        	}
        	num=Integer.valueOf(number);
        	if(isPlus){
        		if(num>32767){
        			return "NODATA";
        		}
        	}else{
        		if(num>32768){
        			return "NODATA";
        		}
        	}
        	for(int i=0;i<16;i++){
        		int now=num&1;
        		if(now==0){
        			chars[15-i]='0';
        		}else{
        			chars[15-i]='1';
        		}
        		num=num>>1;
        	}	
        	
        	String binary = new String(chars);
        	if(!isPlus){
        		binary=changePlusToMinus(binary);
        	}
            return binary+","+getHexByBinaryNumber(binary);
		} catch (Exception e)
		{
			return "INPUTERROR";
		}
    	
    }
    
    /** 把16位的2进制正数变成16位的2进制负数,也就是对应的补码,即1111111111111111-number+1
     * @param number
     * @return
     */
    public String changePlusToMinus(String number){
    	char[] chars=number.toCharArray();
    	// 先1111111111111111-number
    	for(int i=0;i<16;i++){
    		if(chars[i]=='1'){
    			chars[i]='0';
    		}else{
    			chars[i]='1';
    		}
    	}
    	// 再+1  从右向左,找到第一个0,变成1,将右边全部都变成0
    	// 即从右向左,1边0,继续    0变1,停止
    	for(int i=15;i>=0;i--){
    		if(chars[i]=='1'){
    			chars[i]='0';
    		}else{
    			chars[i]='1';
    			break;
    		}
    	}
    	return new String(chars);
    	
    }
    
    
    public Map<String, String> map=new HashMap<String, String>();
	{
		map.put("0000", "0");
		map.put("0001", "1");
		map.put("0010", "2");
		map.put("0011", "3");
		map.put("0100", "4");
		map.put("0101", "5");
		map.put("0110", "6");
		map.put("0111", "7");
		map.put("1000", "8");
		map.put("1001", "9");
		map.put("1010", "A");
		map.put("1011", "B");
		map.put("1100", "C");
		map.put("1101", "D");
		map.put("1110", "E");
		map.put("1111", "F");
	}

    /** 根据16位的二进制字符串返回4位的十六进制字符串
     * @param binaryNumber
     * @return
     */
    public String getHexByBinaryNumber(String binaryNumber){
    	StringBuilder builder=new StringBuilder();
    	for(int i=0;i<16;i=i+4){
    		builder.append(map.get(binaryNumber.substring(i, i+4)));
    	}
    	return builder.toString();
    }
}
0000000000001111,000F
1111111111111111,FFFF
32767
0111111111111111,7FFF
-32768
1000000000000000,8000
32771
NODATA
INPUTERROR

10进制数字变成16位的2进制和4位的16进制

先10进制都变成正数的二进制,然后如果是负数,通过补码=反码+1,生成对应负数的二进制

然后将2进制转为16进制,4个数字为1组,从hashmap里得到对应的16进制