二进制如何转十进制,十进制如何转二进制

  学计算机的朋友刚开始学习时都要接触进制之间的转换,二进制、十进制、八进制、十六进制等,这个是很枯燥的,转来转去就转蒙圈了,别蒙别蒙,今天咱们一个一个搞定,看看二进制和十 进制之间如何相互转换的。

   转成二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制;

  1、 正整数转成二进制。要点一定一定要记住哈:除二取余,然后倒序排列,高位补零。

     也就是说,将正的十进制数除以二,得到的商再除以二,依次类推知道商为零或一时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零就OK咧。哎呀,还是举例说明吧,比如42转换为二进制,如图1所示操作。

  blob.png

   42除以2得到的余数分别为010101,然后咱们倒着排一下,42所对应二进制就是101010.如图2所示更直观的表达。

   blob.png

    计算机内部表示数的字节单位是定长的,如8位,16位,或32位。所以,位数不够时,高位补零,所说,如图3所示,42转换成二进制以后就是。00101010,也即规范的写法为(42)10=(00101010)2.赶紧记住吧。  

   blob.png

 2、  负整数转换成二进制

    方法:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。还以42为例,负整数就是-42,如图4所示为方法解释。最后即为:(-42)10=(11010110)2.

    blob.png

 3、  小数转换为二进制的方法:

     对小数点以后的数乘以2,有一个结果吧,取结果的整数部分(不是1就是0喽),然后再用小数部分再乘以2,再取结果的整数部分……以此类推,直到小数部分为0或者位数已经够了就OK了。然后把取的整数部分按先后次序排列就OK了,就构成了二进制小数部分的序列,举个例子吧,比如0.125,如图5所示。

     blob.png

   如果小数的整数部分有大于0的整数时该如何转换呢?如以上整数转换成二进制,小数转换成二进制,然后加在一起就OK了,如图6所示。

    blob.png


4、  整数二进制转换为十进制:

   首先将二进制数补齐位数,首位如果是0就代表是正整数,如果首位是1则代表是负整数。

   先看首位是0的正整数,补齐位数以后,将二进制中的位数分别将下边对应的值相乘,然后相加得到的就为十进制,比如1010转换为十进制,方法如图7所示。

   blob.png

  5、若二进制补足位数后首位为1时,就需要先取反再换算:例如,11101011,首位为1,那么就先取反吧:-00010100,然后算一下10100对应的十进制为20,所以对应的十进制为-20,方法如图8所示。

   blob.png

  6、将有小数的二进制转换为十进制时:例如0.1101转换为十进制的方法:将二进制中的四位数分别于下边(如图9所示)对应的值相乘后相加得到的值即为换算后的十进制。

  blob.png

 public static void main(String[] args) {
        //SuperTmp tmp = new SuperTmp();
        // 5 二进制:  0000 0000 0000 0000 0000 0000 0000 0101 
        //右移( >> ) 然后右移2位,高位补0:     0000 0000 0000 0000 0000 0000 0000 0001
        System.out.println(5 >> 2);// 结果是1
        System.out.println(5 >>> 2);// 结果是1
        //右移(  << ) 然后左移2位,低位补0:     0000 0000 0000 0000 0000 0000 0001 0100 
        // 0*2^0+0*2^1+1*2^3+0*2^4+1*2^5=20
        System.out.println(5 << 2);// 结果是20
        // 负数右移( >> ) 首先二进制取反,结果加1 然后右移2位,高位补0 
        // -5换算成二进制后为:0101 取反加1为1011   
        //  右移2位    10
        System.out.println(-5 >> 2);// 结果是-2
        //  左移2位    101100
        System.out.println(-5 << 2);// 结果是-20
        // 无符号右移   -5 ===>  1111 1111 1111 1111 1111 1111 1111 1011    
        //  0011 1111 1111 1111 1111 1111 1111 1011
        System.out.println(-5 >>> 2);// 结果是1073741822
        // 4、位与( & )
        // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
        // 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;
        //  即:两位同时为“1”,结果才为“1”,否则为0 
        //例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1。
        System.out.println(5 & 3);// 结果为1
        //  4 & 1   即 0000 0000 & 0000 0001  = 0000 0000 
        System.out.println(4 & 1);// 结果为0
        /* 
         * // 5、位或( | )
          // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
           参加运算的两个对象,按二进制位进行“或”运算。
           运算规则:0|0=0;   0|1=1;   1|0=1;    1|1=1;
              即 :参加运算的两个对象只要有一个为1,其值为1。
            例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111   因此,3|5的值得7。
        */
        System.out.println(3|5);// 结果为7
        /*// 6、位异或( ^ )
                // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
                参加运算的两个数据,按二进制位进行“异或”运算。
                运算规则:0^0=0;   0^1=1;   1^0=1;   1^1=0;
                即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
         */         
         // 例如:5 ^  3 即 0000 0101 ^ 0000 0011 = 0000 0110   因此,5 ^ 3 的值得6。
        System.out.println(5 ^ 3);//结果为6 
        // 7、位非( ~ )
        // 操作数的第n位为1,那么结果的第n位为0,反之。
        /*取反运算符(~)
        参加运算的一个数据,按二进制位进行“取反”运算。
        运算规则:~1=0;   ~0=1;
        即:对一个二进制数按位取反,即将0变1,1变0。
          1010  --- >  0101 
        */
        System.out.println(~5);// 结果为-6 
  }



发表评论