黑马程序员技术交流社区

标题: 十进制转换十六进制 (进制转换问题,难理解,求详解,.... [打印本页]

作者: 王林涛    时间: 2013-5-13 17:53
标题: 十进制转换十六进制 (进制转换问题,难理解,求详解,....
本帖最后由 王林涛 于 2013-5-14 09:11 编辑

将60转换成十六进制代码,难理解,求详解,绝对求详解!
拜托啦!{:soso_e183:}

class ArrayTest
{
public static void main(String[] args)
{
  toTex(60);
}
public static void toTex(int num)
{
for (int x=0;x<8 ;x++ )
{
  int temp = num&15;
  if(temp>9)
   System.out.println((char)(temp-10+'A'));  → 还有这个语句,A为什么要加单引号?
  else
   System.out.println(temp);
  num = num >>>4;
}
}
}

作者: 王林涛    时间: 2013-5-13 17:55
尹桥印 发表于 2013-5-13 17:54
我想说再把毕老师的那个进制转换的视频再多看几遍就行了

看了、都看蒙了---

作者: 神之梦    时间: 2013-5-13 18:07
本帖最后由 神之梦 于 2013-5-13 18:09 编辑

A不加单引号不就变成常量或者变量了么?在ASCII码中,A等于65,那么加上单引号在这里就相当于temp-10+65,'A'表示的是字符,在这个运算中,类型自动提升到了int,所以将结果加了个强转(char),这样打印出来显示的就是A-F了。
建议楼主多看几遍,冷静点听老师讲的,别一不懂就懵了,最好是把哪个代码不懂先弄清楚了
作者: 王林涛    时间: 2013-5-13 18:16
神之梦 发表于 2013-5-13 18:07
A不加单引号不就变成常量或者变量了么?在ASCII码中,A等于65,那么加上单引号在这里就相当于temp-10+65,' ...

嗯嗯、谢谢
作者: 赵崇友    时间: 2013-5-13 18:33
看以下的详解:希望对你有帮助。
  1. class ArrayTest//定义一个类
  2. {
  3. public static void main(String[] args)//主函数,程序入口
  4. {
  5.    toTex(60);//调用toTex方法
  6. }
  7. public static void toTex(int num)//类中 的静态方法,为了让main调用,所以必须是静态。后面会学到
  8. {
  9. for (int x=0;x<8 ;x++ )//循环8次,因为一个int是32位的,一个十六进制用4个二进制表示,多以循环8次
  10. {
  11.    int temp = num&15;//定义一个临时变量,获取num二进制位的末4位,然后将其变成int型的临时变量temp,
  12.    if(temp>9)//判断temp是否大于9,因为16进制包括0-9和A-F,所以要判断temp的值,如果超过了9,它的十六进制要用字母表示。
  13.     System.out.println((char)(temp-10+'A'));  //→ 还有这个语句,A为什么要加单引号?   这里加单引号的原因是:在十六进制里,10是用A表示的,而在ASCII码中表示
  14. //为65,这里加单引号的是ASCII中的字符。这主要是想在控制台中打印能正确表示temp的字符,如果直接这样打印:System.out.println(temp);它的结果是与temp值对应的  ASCII码的字符,就不是我们想要得十六进制中的字母了。这些都是由于输出语句要输出到控制台上造成的,输出到控制台上的都是字符串,包括你看的数字1、2、3.
  15.   else
  16.     System.out.println(temp);
  17.    num = num >>>4;//num无符号右移4位,是在做num/16,这个应该明白为什么。
  18. }
  19. }
  20. }
复制代码

作者: 赵崇友    时间: 2013-5-13 18:34
建议看看ASCII码表 和16进制。
作者: 8047107    时间: 2013-5-13 18:42
楼主果真跟我进度一样 我刚才看完这个
作者: 王靖远    时间: 2013-5-13 20:15
A是字符型的啊当然要加单引号。你对第一天第二天的基本功掌握的不够扎实,所以看不懂。你要搞清楚关键字 标识符 常量变量 运算符 语句这些东西到底是什么。里面的细节都要搞清楚才来分析代码。
作者: rosv    时间: 2013-5-13 20:27
先从for循环开始吧,为什么是8次循环,因为下面&是按位与比较,与15就是二进制的1111,int 是32位的,32/4=8
60的二进制是111100,第一次循环 &15的 结果是1100,转换十六进制后就是C
每次取四位转换十六进制即可,后面小于等于9就不用转换了,因为十进制和十六进制的0-9都是一样的
大于9时,为了表示A-F,加单引号是把A当作字符来用,由于自动类型转换,会转换为65,你也可以直接写成65,不过失去了可读性。
完成一次循环后,右移四位,比较之前的位数即是11转换后是3
结果是倒着的,实际值是 3C
作者: kaka小明    时间: 2013-5-14 10:08
下面是注释:
class ArrayTest
{
public static void main(String[] args)
{
   toTex(60);
}
public static void toTex(int num)
{
for (int x=0;x<8 ;x++ )//一个int32位对应8位的16进制数,这个依据传入的数据类型而变,如果是short就是4
{
   int temp = num&15;//数据在计算机中的存储格式均为二进制码,nun&0x0000 000f:取低4位二进制码对应的数据
   if(temp>9)//如果大于等于10,那么需要字母‘A’--'F'代替,或者是‘a’-'f'
    System.out.println((char)(temp-10+'A'));  → 还有这个语句,A为什么要加单引号?这里的‘A’是一个字符常量,如果去掉了,就是个变量名了.10对应的是‘A’,11对应的是‘B’,依次类推
  else
    System.out.println(temp);
   num = num >>>4;//这里右移4位,也就是把num的低4位移掉,相当于除以16,继续算下一个4位二进制码。LZ貌似多了个‘>’.
}
}
}
作者: bushangkoukou    时间: 2013-5-14 11:18
赵崇友 发表于 2013-5-13 18:33
看以下的详解:希望对你有帮助。

学习了,很详尽




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2