二进制
来源:互联网 发布:杀死汝爱真实事件 知乎 编辑:程序博客网 时间:2024/06/04 17:39
一、常用进制转化
- 二进制:只有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 }}运行结果:111000016070112112112
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,08143我爱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;}
- 小米面试题目
世界上有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;}