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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 球球_ 于 2015-9-8 22:49 编辑


    第一次基础知识考试题有这么一道题(14题),其作用是输出一个数的2进制数,观察实现的代码发现其主要用到了位运算“<<”和“&”,实现的逻辑是用一个循环,将1依次移动31~~0位与输出的数取“与”,这样子就可以得到这个数的2进制数。

将问题发散一下,思考一个问题,可以输出8进制或者16进制吗?怎么输出?

    我们知道一个数的8进制是将将其2进制从右到左,每次取三位,位数不够补0,因为是从右到左,为保证2进制输出与8进制输出的一致性,我们可以将上面1处的代码修改一下
    for(int j = 0; j <32; j++)
            if(((i<< j) &  1) != 0)--2
                System.out.print("1");
            else
                System.out.print("0");
    这样就可以反过来输出一个2进制数的每一位,我们再思考一个问题,怎么得到某一个bit位的值(01)?答案就是该位上的值(0或1)与1取与即可,该位上值为0,和1取与得0,该位上值为1,与1取与得1,图解如下:
                   ............................0                                                ............................1
      &000000000000001                & 000000000000001
结果为   000000000000000                   000000000000001
    也就是上面的2中的做法,依次右移与1取与得到i每一位上的值。
    如果要得到连续两个bit位的值呢?与3(二进制0b11)取与,图解如下:
                   ..........................10                                               .........................01
      &000000000000011                &000000000000011
结果为   000000000000010                  000000000000001
   10结果仍是10,01结果仍是01.
    这样就知道怎么求一个数的8进制了,8进制每一位是该数补码连续的三个bit位,将需要求出的三个bit位与7(二进制0b111)取与即可...
思路和步骤:【求8进制】
1.  我们先将判断x的值,如果为0,直接输出0
2.  将x与7进行与操作,其值就是x的8进制值的最低位。
3.  再将x无符号右移三位,在与7进行与操作其值就是x的8进制的倒数第2位
4.  继续无符号右移三位,直到相与结果为0. (为0以后,前面的位不用再计算)
5.  定义一个char数组来存放每次输出的值, 定义一个变量int pos记录下数组中输出位置。最后将数组打印出来。
    我们给出代码:
public static void translateOctal(int num)
{
    if(num ==0)
    {
       System.out.println(“0”);
           }
           char[] chs = {'0','1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7'};
           char[] arr = new char[32];
           int pos =arr.length – 1;
           while(num != 0)
           {
        int temp = num & 7;
        arr[pos--] = chs[temp];
        num = num >>> 3;  
            }
            for (int x = pos; x< arr.length; x++)
         System.out.print(arr[x]);
            System.out.println();
}
    相同的道理,我们可以求出一个数的16进制。【求16进制】
思路和步骤:
1.  我们先将判断x的值,如果为0,直接输出0
2.  将x与15进行与操作,其值就是x的16进制值的最低位。
3.  再将x无符号右移四位,在与15进行与操作其值就是x的16进制的倒数第2位
4.  继续无符号右移四位,直到相与结果为0. (为0以后,前面的位不用再计算)
5. 定义一个char数组来存放每次输出的值, 定义一个变量int pos记录下数组中输出位置。最后将数组打印出来。
代码如下:
public static void translateHex(int num)
{
    if(num ==0)
       System.out.println("0");
    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 - 1;
    while(num!= 0)
    {
       int temp= num & 15;
       arr[pos--]= chs[temp];
       num =num >>> 4;  
    }
    for (int x= pos; x < arr.length; x++)
       System.out.print(arr[x]);
    System.out.println();
}  

QQ图片20150907234800.png (13.25 KB, 下载次数: 5)

考试题14

考试题14

评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
倪海营 + 4 很给力!
温暖的小白 + 1

查看全部评分

26 个回复

倒序浏览


观察共性,我们发现转化为8进制和16进制的代码几乎是相似的,除了取与的数7和15,以及无符号右移的位数,我们将之抽象提取到一个方法里面,确定函数传入三个参数(数值、比较数、以及偏移位)。修改如下:
public static void translate(int num, int compareNumber, int offset)
{
    if(num == 0)
    {
       System.out.println(“0”);
}
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 – 1;
while(num != 0)
{
        int temp = num & compareNumber;
        arr[pos--] = chs[temp];
        num = num >>> offset;   
}

for (int x = pos; x < arr.length; x++)
        System.out.print(arr[x]);

System.out.println();
}
    这样,求2进制调用translate(x, 1, 1);
    求8进制只需调用translate(x, 7, 3);
求16进制只需调用translate(x, 15, 4);即可实现代码
回复 使用道具 举报
zzq18217362451 来自手机 中级黑马 2015-9-8 06:29:04
藤椅
研究的好高深啊
回复 使用道具 举报
shijinlong 来自手机 中级黑马 2015-9-8 09:10:49
板凳
膜拜啊,大神,看的头发晕
回复 使用道具 举报
hpuwuxu 来自手机 中级黑马 2015-9-8 14:36:45
报纸
哈哈,学的很深入
回复 使用道具 举报
zzq18217362451 来自手机 中级黑马 2015-9-10 00:18:22
地板
牛逼,佩服
回复 使用道具 举报
fdhm 来自手机 中级黑马 2015-9-10 01:05:42
7#
大神,求带我啊
回复 使用道具 举报
zsj1992 来自手机 中级黑马 2015-9-10 01:07:07
8#
太牛了,现在都看不懂
回复 使用道具 举报
ZZBY 中级黑马 2015-9-10 01:12:06
9#
位运算很神奇高效
八进制  》》》3后&
十六进制》》》4后&
回复 使用道具 举报
横创 来自手机 中级黑马 2015-9-10 01:28:05
10#
看了就烦
回复 使用道具 举报
且听风_R0pZK 来自手机 中级黑马 2015-9-10 06:28:28
11#
楼主这个程序很不错!毕老师的视频里面也曾经提炼过的。加油,共同进步哈
回复 使用道具 举报
thriver2010 来自手机 中级黑马 2015-9-10 07:15:07
12#
进制转换,转的头晕
回复 使用道具 举报
说的真好赞一个!!!!
回复 使用道具 举报
横创 来自手机 中级黑马 2015-9-13 11:28:04
14#
恭喜楼主中奖了
回复 使用道具 举报
周中侠 来自手机 中级黑马 2015-9-13 22:23:28
15#
牛,值得学习一下思想
回复 使用道具 举报
给自己回个贴,点个赞
回复 使用道具 举报
挺不错的
回复 使用道具 举报
lu518627 来自手机 中级黑马 2015-9-21 23:40:08
18#
回复 使用道具 举报
厉害呀!
回复 使用道具 举报
很有用,谢谢!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马