一、常用进制转化
- 二进制:只有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>i*8)&0xff);
}
return arr;
}
/**
* byte到int
* @param arr
* @return
*/
public static int bytes2int(byte[] arr){
int result = 0;
for (int i =0;isarr = 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;
}
- 小米面试题目
世界上有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;
}