A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹俊 中级黑马   /  2012-5-22 01:07  /  1790 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曹俊 于 2012-5-22 13:37 编辑


各位大虾们,那个第14行中,为什么输出语句是"temp-10+‘A’“?    temp我知道是定义的变量,定义的变量减去10我也明白,但为什么还要加上‘A',并且前面还要强制转换成char字符,为什么呀?老毕的这段视频,突然冒出“这段代码他讲过”,可我看的视频到现在,没发现他讲过呀,所以搞不懂,还望高手们指点下...
另外最后的18行,又是什么意思,右移无符号4位,不懂啊...求解~~~~{:soso_e109:}{:soso_e109:}{:soso_e109:}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

5 个回复

正序浏览
本帖最后由 袁錦泰 于 2012-5-22 11:25 编辑

首先我请你耐心看完下面的话,在这里我不打算给你讲解位运算,因为与你的问题没有直接关系.只针对(char)(temp-10+'A');这句话为你讲解.如果你的疑问已经解决了就不必浪费时间了.
然后我想问你这是不是一个做16进制数转换的程序?16进制数的特点是什么?在程序中你怎样才能体现出16进制数表达形式的特点?明确这几点对你理解程序是至关重要的.
1.按照平常思路我们对十六进制数的理解是从0到15表示.对应十进制数就是0-9、A-F.0-9我就不说了,这里的A-F所对应的是10-15.
2.在你取最低八位的过程中,每取出八位的结果并不确定,但肯定不会大于16(小于等于15),既然是十六进制转换,你就要按照十六进制数的特点来表示你最终得出的结果,这时你在输出语句中写出了(char)(temp-10+'A');
3.变量temp代表的是每次取出最低八位后的值,这个值像我在第二点所说,肯定不会大于16(小于等于15).好了,按照我们平常的思路这个十六进制数的结果我们已经得到了,但是它按照计算机语言的表达形式还不是很完美,为什么?因为如果每次取出八位的值中含有大于10小于15的结果,就必须要转换为其对应的A-F字母,这样才符合十六进制数的表达形式特点.
4."temp-10"-->假如你的最低八位值大于10,那么取出个位数字;+'A'-->A对应十六进制数中的10,如果你的最低八位恰好为10也不会影响最终的结果,在+'A'过程中涉及到自动类型提升,也就是说本是字符'A',但在这个算术表达式中字符型的'A'被转换为int型的'A',对照ACSII的数字就是65,现在temo-10+'A'的最终结果我们已经确定了,它是一个int型的数字.
5.回头看你执行这句输出语句前所要执行的判断条件是如果最低八位大于9,那么输出temp-10+'A',这时你发现输出的结果是一个int型的数字,根据判断条件你想要得出的结果是如果最低八位大于9,那么我就要与之对应的字母A-F.结果为int该怎么办?在算术表达式前面加上(char),意思就是表示,无论后面的结果是什么数据类型,我最终就是要得到字符型的结果,在这里(char)的作用就在于此,强行转换数据类型.

最后你如果还不能理解,联系我!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

回复 使用道具 举报
[b]你程序中写的  int temp=num&15
这段代码会得到一个值  temp  然后判断temp的值是否大于9,因为十六进制如果大于9就用A,B,C,D,E,F来表示
那么(char) (temp-10 +‘A' )中temp-10就是大于9多少?如果是10  那么(char)( 10-10+’A‘)就会返回A对应的ASCII码值 应该是65,以此类推不就可以得到大于9的十六进制为表示的位数A,B,C,D,E,F了。其中num=num>>>4   你可以看看我的博客
5. 位运算符

位运算符都是操作二进制的
<<左移的位数越大 原来的数值就是 乘以2的倍数
>>又移的位数越大 原来的数值就是 除以2的倍数
移n位就是乘以或者除以2的n次幂
例如:
3<<2 在内存中是怎么表现的呢?
这是3的二进制表现形式

左移2位

右边空出来的两位用00来补齐。
这样就能看出3<<2=12
6>>2呢?
6的二进制是:
0000 0000 0000 0000 0000 0000 00000 0110
又移2位

左边空出2为用00补齐
所以6>>2=1
>>>无符号又移和 >> 的区别是
>>又移以后缺少的位数用最高位的数字补齐,(负数用1补齐,正数用0补)
>>>无论什么数又移以后缺少的用0来补

最后就是这些视频里面都有,一定要静下心来慢慢看!
后面还有视频是关于你这个方法的,不过是数组解决的,那就不会用到 你说的问题了,努力

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李斌 于 2012-5-22 10:39 编辑

。。。。。。。。。。
回复 使用道具 举报
//问题一  temp-10+'A'
//因为十六进制  表示的数字只有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(10就是A了)
//举个例子
//你temp返回的是12   那么  12-10+'A',A会自动提升了int  结果是12-10+65=67
//然后对应的ASCII是C ,返回c了。
//如果是小于10,直接返回这个数。
//问题二  右移无符号4位
//就是将这个数 的位数移动了4位 ,因为我们知道一个16进制的数 ,4个二进制表示
//一位十六进制的一位。2^0+2^1+2^2+2^3=1+2+4+8=15;就是16进制的F。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
因为要转换成16进制,而16进制的表现形式是(1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) 超过9的数字都是字母代替,当temp大于9的时候,用(temp-9+‘A’)才能得到对应位上的字母。
A在asci表中对应的是65,而temp-10=2,2这时候是int型的值,所以A这时候被强制转换成了65,即结果为67,而此题想要的结果为C,对应的就要转换成char型,即char(67) = C。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马