菜鸟笔记
提升您的技术认知

二进制

一、常用进制转化

  • 二进制:只有0,1
  • 八进制:0-7(注意:开头用0表示这是个8进制的数字)
  • 十进制:0-9
  • 十六进制:0-9,A,B,C,D,E,F(注意:用0X开头表示这是个16进制的数)
    引入8、16进制是为了更短的表示一个数,数字的长度会变短好多;
    比如:2进制:1101 ,8进制:15,10进制:13,16进制:D
    这样子就更加简便表示1个数字了,对于计算机而言。

二进制转化成10进制:
比如:1101 = 1*2^3+1*2^2+0*2^1+1*2^0 = 13(10进制)

10进制转化成2进制:
采用除2取余,然后倒序输出余数的方法。

同理,8进制,16进制转化成10进制,就按照上面二进制转化成10进制的做法来做:
比如:(8进制)15 = 1 * 8^1+5*8^0 = 13(10进制)
(16进制)D = 1*D^0 = 13(10进制)

那么,如果10进制转化成8,16进制呢?
同样模仿转2进制的思路:除相应的数,取余数倒序输出就可以;

额外的插曲:

2进制要是转8,16进制呢?很容易做到:
8:(3位一组)
16:(4位为一组)
比如:1101100,3位为一组:154(8进制)
4位为一组:5C(16进制)
所以就出现了16、8进制。

JDK的进制转化

通过JDK内置方法帮助我们完成进制转化

/**
 * Author:林万新 lwx
 * Date:  2017/11/15
 * Time: 16:55
 * 进制转化:利用JDK内置的进制转化
 */
public class RadixMain {
  
    public static void main(String[] args) {
        //十进制转化成其他进制
        System.out.println(Integer.toBinaryString(112));//2进制
        System.out.println(Integer.toOctalString(112));//8进制
        System.out.println(Integer.toHexString(112));//16进制
        //其他进制转化成十进制
        System.out.println(Integer.parseInt("1110000",2));//2
        System.out.println(Integer.parseInt("160",8));//8
        System.out.println(Integer.parseInt("70",16));//16
    }

}
运行结果:
1110000
160
70
112
112
112

2进制的位运算


详细介绍:




4:按位取反:~
使二进制每一位按位取反,0变1,1变0
~0 = 1,~1 =0;


计算机中二进制都是以补码形式储存的
对于正数:原码 = 补码,所以不变;
但是对于负数,原码!= 补码,需要用补码表示出来,
负数以其正数的补码表示在计算机中:
计算补码如下:

数据用进制表示

java数据传输用的是字节码;
数据类型转化成字节

转化后关于怎么存放:
大小端:

数据类型与字符串之间的转化

/**
 * Author:林万新 lwx
 * Date:  2017/11/15
 * Time: 22:13
 */
public class Convert {
  
    /**
     * int 转化字节数组byte[]
     * long同理
     */
    public static byte[] int2Bytes(int id){
        byte[] arr = new byte[4];
        for(int i=0;i<arr.length;i++){
            arr[i] = (byte)((int)(id>>i*8)&0xff);
        }
        return arr;
    }

    /**
     * byte到int
     * @param arr
     * @return
     */
    public static int bytes2Int(byte[] arr){
      int result = 0;
      for (int i =0;i<arr.length;++i){
          result += (int)((arr[i] & 0xff)<<i*8);
      }
      return result;

    }

    public static void main(String[] args) {
        byte[] arr = Convert.int2Bytes(8143);
        System.out.println(arr[0] +","+arr[1]+","+arr[2]+","+arr[3]);

        System.out.println(bytes2Int(arr));

        //字符串与字节数组转化
        String s = "我爱java";
        byte[] sarr = s.getBytes();

        String ss = new String(sarr);
        System.out.println(ss);

    }
}
运行结果:
-49,31,0,0
8143
我爱java

大小端介绍
http://blog.csdn.net/zhaoshuzhaoshu/article/details/37600857
位运算:
http://blog.csdn.net/iukey/article/details/7195265

题目

1.练习题目

   输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

/*方法思想:把n的2二进制表示法依次判断最右边是不是1;
与n和1进行按位&的操作,如果结果不等于0,则count++;
但是问题是这是正整数的前提,如果是负数,需要让1左移1位,而不是
让n左移,因为负数是以补吗的形式在计算机存储的。

*/
public int NumberOf1(int n) {
    int count=0;
    int flag=1;
        //为什么条件是flaf!=0,是因为32整数,需要左移32次,直到0.(负数和正数的原因),如果是正数白白多循环好多次,
        while(flag!= 0){
        if((n & flag) !=0){
            count++;
        }
           flag = flag << 1;
     }
   return count;
}
  1. 小米面试题目
    世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?
    /*
    //先进行异或运算,再用上面的方法统计多少个!!!
    */

public int countBitDiff(intm, int n) {

    intdif=m^n;//先将二者做异或运算,得到结果;
    intcnt=0;
    while(dif!=0){
        dif=dif&(dif-1);
        cnt++;
    }             //统计一个整数dif含有多少个1;
    returncnt;
}