首先介绍二进制的位运算:
(1)按位与 &
00000000 00000000 00000000 00000000 & 11111111 11111111 11111111 11111111
结果:00000000 00000000 00000000 00000000
(2)按位或 |
00000000 00000000 00000000 00000000 & 11111111 11111111 11111111 11111111
结果:11111111 11111111 11111111 11111111
(3)异或 ^ 不同为1,相同为0
00000000 00000000 00000000 00000000 & 11111111 11111111 11111111 11111111
结果:11111111 11111111 11111111 11111111
(4)取反 ~
00000000 00000000 00000000 00000000 取反 11111111 11111111 11111111 11111111
(5)左移运算 <<
对于正数:左丢弃,右补0 相当于在原10进制数 每移动一位 *2
00000000 00000000 00000000 00000010 (2) << 2 =00000000 00000000 00000000 00001000(2*2*2=8)
(6)右移运算 >>
对于正数:右丢弃,左补0 相当于在原10进制数 每移动一位 /2
00000000 00000000 00000000 00001000(8) >>2=00000000 00000000 00000000 00000010 (8/2/2=2)
(7)无符号右移 >>> 对于正负数都一致:右丢弃,左补0
关于负数的左右移:左移:左丢弃,右补0;右移;右丢弃,左补1;
例如-8>>2
首先,负数二进制是以其正值的补码形式表示。
补码=反码+1;
-8,其正值二进制 为: 00000000 00000000 00000000 00001000
反码 :11111111 11111111 11111111 11110111
补码= 反码+1:11111111 11111111 11111111 11111000
然后右移2位:11111111 11111111 11111111 11111110 (这个二进制负数就是要求得的值,得把它转为十进制形式)
反码=补码-1:11111111 11111111 11111111 11111101
取反码 : 00000000 00000000 00000000 00000010
得到十进制加负号 :-2
*************************************************************************************************************************************************************
接下来,介绍Java里进制转换
java中的基本数据类型:byte(8bit);short(16bit);int(32bit);long(64bit)
java中十进制转化为其他进制:
Integer.toBinaryString(100);//二进制
Integer.toHexString(100);//十六进制
Integer.toOctalString(100);//八进制
java其他进制转为十进制:
Integer.parseInt("二进制",2);
Integer.parseInt("八进制",8);
Integer.parseInt("十六进制",16);
接下来附上Java十进制数据转为二进制字节数组和二进制字节数组转为十进制数据的代码:
//int->byte
public byte[] IntToByte(int a){
//int 32bit;byte 8bit;所以每八位转换一个byte,byte[]里4个元素
byte[] byte1 = new byte[4];
for(int i=0;i<byte1.length;i++){
//每次取八位,从低位到高位,与0xff(11111111)做位运算&,最强转成byte类型
byte1[i]=(byte)((int)(a>>(i*8))&0xff);
}
System.out.println("["+byte1[0]+","+byte1[1]+","+byte1[2]+","+byte1[3]+"]");
return byte1;
}
//byte->int
public int ByteToInt(byte[] byte1){
int a = 0;
for(int i =0;i<byte1.length;i++){
//0xff(11111111)做位运算&,左移i*8位;
a += (int)(byte1[i]&0xff)<<(i*8);
}
return a;
}
public static void main(String[] args) {
Test test = new Test();
byte[] byte1 = test.IntToByte(6788);
System.out.println(test.IntToByte(6788));
System.out.println(test.ByteToInt(byte1));
}
打印结果:
[-124,26,0,0]
[-124,26,0,0]
[B@3a5476a7
6788
最近在整理一些资源工具,放在网站分享 http://tools.maqway.com
欢迎关注公众号:麻雀唯伊 , 不定时更新资源文章,生活优惠,或许有你想看的