进制转换
1.十进制转为二进制
将十进制连续对2取模
//十进制转为二进制 public static void tenToBin(int num) { StringBuffer sb=new StringBuffer(); char[] chs={'0','1'}; char[] arr=new char[32]; int pos=arr.length; while(num!=0) { int temp=num&1; arr[--pos]=chs[temp]; num=num>>>1; } System.out.println(sb.reverse()); }
2.十进制转为十六进制
以60举例,60的二进制如下:
//十进制转十六进制 public static void tenTohex(int num) { StringBuffer sb=new StringBuffer(); for(int i=0;i<8;i++) { /*取最低四位*/ int temp=num&15;
if(temp>9) { sb.append((char)(temp-10+'A')); } else { sb.append(temp); } /*右移四位,去掉之前取的最低四位*/ num=num>>>4;
if(num==0)//如果num==0,则无需继续循环
{
break;
}
} System.out.pringln(sb.reverse()); }
3.十进制转化为所有进制
参数说明:
num要转化的数字,
base要转化的进制(1二进制,7八进制,15十六进制),
offset要取得最低位的位数(二进制1位,八进制3位,十六进制4位)
参数解释:
1.base和offset解释:一个数字如如果要取得最低四位,是进行“&”操作。
如:
(1)60的二进制:0000-0000 0000-0000 0000-0000 0011-1100 要取得最低位,则将60与二进制的1 进行&操作,得到的就是60的二进制的最低位。
& 0000-0000 0000-0000 0000-0000 0000-0001 这里是要转为二进制,所以和1进行&操作,如果是八进制,则为0000-0000 0000-0000 0000-0000 0000-0111以此类推
----------------------------------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0000
这样就得到了60的二进制的最低第一位的值。
(2)那么如何得到二进制的最低第二位呢,方法是,将60的二进制右移一位(>>>这个一位就是offset参数的意思),高位补上最高位相同的数(这里是0所以高位补0,如果是1,则补1)
60右移之后: 0000-0000 0000-0000 0000-0000 0001-1110 再和1进行&操作,红色的0就是右移一位之后补上的0
& 0000-0000 0000-0000 0000-0000 0000-0001
---------------------------------------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0000 还是0
(3)继续右移操作
60右移之后: 0000-0000 0000-0000 0000-0000 0000-1111 再和1进行&操作,红色的0就是右移一位之后补上的0
& 0000-0000 0000-0000 0000-0000 0000-0001
-----------------------------------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0001 与之后,就得到一,所以又得到一位
重复以上操作,需要重复32次,因为一个二进制数有32位。
如果是转为八进制,则一次移动3位,且&操作是111,因为三位能表示一个八进制的值,如111就是7
十六进制同理,一次移动4位,且&操作是1111,因为4位能表示一个十六进制的值,如1111就是15
关于>>>和>>的区别,大概是>>这个是移动之后,高位是补0,而>>>移动之后,高位是补和最高位一样的数字,如果数字是正数,则两个数没区别,如果是负数,则有区别
代码如下:
//十进制转化为所有进制 public static void tenToall(int num,int base,int offset) { char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[] arr=new char[32]; int pos=arr.length; while(num!=0) { int temp = num & base; arr[--pos] = chs[temp]; num=num >>> offset; } for(int i=pos;i<arr.length;i++) { System.out.println(arr[x]); } }