黑马程序员技术交流社区
标题:
进制转换问题
[打印本页]
作者:
黑马-陈思源
时间:
2013-3-25 18:24
标题:
进制转换问题
本帖最后由 黑马-陈思源 于 2013-3-25 21:10 编辑
class jinzhi
{
public static void main(String[] args)
{
//ToBin(16);
//ToHex(60);
//ToHex_CheckT(60);
ToBin_CheckT(-6);
}
//十进制转二进制的函数
//思路:十进制转二进制就是除2取模的过程
public static void ToBin(int num)
{
//定义一个容器
StringBuffer sb=new StringBuffer();
while(num>0)
{
sb.append(num%2);
num=num/2;
}
System.out.println(sb.reverse());
}
//十进制转二进制的函数 查表法
//思路 参照转十六进制
public static void ToBin_CheckT(int num)
{
//定义一个表
char[] chs={'0','1'};
char[] arr=new char[32];//二进制能装32个十进制的数 int型 32位。 long才是 64位 满。
int pos=arr.length;//定义一个长度
while(num!=0)
{
int temp=num&1;//每次取2的模 (每次&1)
arr[--pos]=chs[temp];//while循环中数组循环赋值
num=num>>>1;//每次循环除2(每次右移一位)
}
System.out.println("你所输入的十进制数转换为二进制为:");
//遍历数组
for(int i=pos;i<arr.length;i++)
{
System.out.print(arr
+",");
}
}
//十进制转十六进制的函数
//思路:(temp-10+'A') 意思是 得出十六进制中超过9的子母部分。
public static void ToHex(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;
}
System.out.println(sb.reverse());
}
//十进制转十六进制的函数 查表法!!!
//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
//一一对应 就可以把0到F保存到一个数组中 实现 该函数。
public static void ToHex_CheckT(int num)
{
//建立表
char[] chs={'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F',};
char[] arr=new char[8];
int pos=arr.length;//定义一个长度
while(num!=0)
{
int temp=num & 15;
arr[--pos]=chs[temp];//while循环中数组循环赋值
num=num>>>4;//每次循环右移4位
}
System.out.println("你所输入的十进制数转换为十六进制为:");
//遍历数组
for(int i=pos;i<arr.length;i++)
{
if(i==arr.length-1)//最后一位不带逗号
System.out.print(arr
);
else
System.out.print(arr
+",");
}
}
}
ps:请教一下。关于十进制转换为不同的进制的时候 位移几位 是根据什么来定的?
作者:
刘海东
时间:
2013-3-25 18:47
进制转换的代码,它的思想其实和我们自己运算的一样。比如,十进制转换为二进制,我们通常的做法就是除以二取余数,至这个数到0或者1,除以2可以把代码写成num=num>1,。十六进制就是除以16取余数,除以十六就把代码写成num=num>4,八进制就是除以8取余数,除以十六就把代码写成num=num>3。这里的右移是根据位运算决定的。右移一位就是除以2的1次方,右移两位就是除以2的两次方,右移4位就是除以2的4次方,依此类推。
作者:
炉海佳
时间:
2013-3-25 18:49
本帖最后由 炉海佳 于 2013-3-25 18:51 编辑
比如 转换成16进制,四个二进制位就是一个十六进制位。
0101--1010
5 a(10) 0101就是5 ,1010就是10也就是a
转成8进制是 三个二进制位代表一位
001--011--010
1 3 2
也就是由几个二进制位代表一位所决定的
作者:
HM朱蛟
时间:
2013-3-25 20:14
LZ不必纠结于各种进制间的转换 我最开始学习进制转换的时候也是各种 查资料 什么小数二进制转换 负数二进制转换 什么8进制直接转成16进制
后来我回头再去看的时候 其实大可不必这么耗费精力
只需要将2进制当做一座桥梁即可 意思就是懂得如何将其他进制转换为2进制就行了 就是无论几进制转换为几进制 先转成2进制 然后再将2进制转换为另一个进制 看上去挺费事 其实比你耗费精力去研究各种进制转换算下来更省事
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
N转10:
方法:N-->二-->十
16-->10
十六:3B --> 二: 0011 -1011---->十:59
48 11 <-累加
10-->8
八:750 --> 二: 111-101-000---->:十488
1-1110-1000
256 224 8 <-累加
10转N:缺位从左边补0
方法:十-->二-->N
10-->16
十:78 --> 二: 0100 -1110---->十六:0x4E
4 14 <-分开算
10-->8
十:90 --> 二: 0 01-011-010---->八:132
1 3 2 <-分开算
10进制负数二进制:取反+1
-6:其实就是6的2进制取反+1;
6=110
001 取反的意思就是将二进制1变成0,二进制的0变成1;
001 + 001 =010
总结:
10转N,N转10,中间都要转成二进制来过渡,
N转10中,16进制取4个2进制位一组,结果分开算,8进制取3个2进制位1组,结果分开算。
10转N中,16进制取4位2进制一组,结果累加,8进制取3个2进制位1组,结果累加。
作者:
黑马-陈思源
时间:
2013-3-25 21:10
谢谢各位~~~{:soso_e163:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2