进制转化
包括十进制转化为二进制,八进制,十六进制
十进制转化为二进制使用的是位移运行和位与运算
十进制转化为八进制就是就是十进制数直接除以8,得出得整数就是八进制的十位以前的数,余数是八进制个位数,然后不断循环
十进制转化为十六进制同八进制
package cn.Offer; import java.util.Scanner; /* * 把一个整数(任何整数,包括正数或者负数)转化为二进制 * 获取中间1的个数 * * 各种做法都是对各种进制每位的分解再组合 * 那么组合的方式有使用字符串连接,栈,数组 * 这里使用的都是字符串连接 */ public class Exam10_HexadecimalConversion { public static void main(String[] args) { System.out.println("请输入一个整数"); Scanner sc= new Scanner(System.in); int value = sc.nextInt(); System.out.println("结果:"); System.out.println("这个整数的二级制是" + ConventIntToBinary(value)); int num = NumOf1InBinary(value); System.out.println("其中包含了"+num+"个 1 "); System.out.println("这个整数的八进制是" + ConventIntToBase8(value)); System.out.println("这个整数的十六进制是" + conventIntToBase16(value)); } /* * 十进制转化为十六进制 */ private static String conventIntToBase16(int value) { String strResultString = ""; while(value>16) { String r = value%16+""; if(value%16>10) { r= Character.toString((char)((int)('A') + (value%16 -10))); } strResultString = r + strResultString; value=value/16; } strResultString = value + strResultString; return strResultString; } /* * 十进制转化为八进制 */ private static String ConventIntToBase8(int value) { String strResultString=""; while(value>8) { strResultString = value%8 + strResultString; value=value/8; } strResultString = value + strResultString; return strResultString; } /* * 计算二进制里1 的个数 * 判断结束的标识使用flag==0 * 因为flag不断左移,移动32次之后,为0 */ private static int NumOf1InBinary(int value) { int count = 0; int flag = 1; while(flag!=0) { if((value & flag)!=0) count++; flag=flag<<1; } return count; } /* * 把十进制转化为二进制 * 返回的结果的类型 * 如果是int类型,显然不行,因为返回的是二进制,二进制可以达到32位数字,不管是int还是long类型都不可以, * 因为32位的数字在内存中占用的是32*8位 * * 返回字符串 * * 判断结束的标识, * 如果使用的是flag = 0 ,那么100返回的结果是00000000000000000000000001100100 * 使用value =0,返回结果是1100100 * */ private static String ConventIntToBinary(int value) { String strResultString = ""; int flag = 1; while(value!=0) { if((value & flag)!=0) { strResultString = 1+strResultString ; value = value^ flag; }else { strResultString =0+ strResultString ; } flag = flag<<1; } //return Long.parseLong(strResultString); return strResultString; } }
顺便说下把十六进制转化为十进制
/* * 十六进制转化为十进制 */ private static int ConventBase16ToBase10(String value16) { int result =0; if(value16=="") { return 0; } char[] v16 = value16.toCharArray(); for(int i=0;i<v16.length;i++) { int key=0; char v = v16[v16.length-1-i]; if(v>='A' && v<='F') { key= v-'A' +10; }else{ key= v-'0'; } result = result + key* (int)Math.pow(16, i); } return result; }