由于JAVA二进制基础那节课程讲解实在低于应该有的教学水平,故在此写下笔记。
*虽然是免费课程,但是我不认为这是一个该有的【教学】课程,我是一个很认真的人,所以我决定自己做笔记,自己找资料进行学习,这位老师也许是一个实战很强的人,但是人各有所长也各有所短,勿喷。
—————————————————————————————————
二进制基础
进制转换
-1(十进制)=0000 0001 -2(十进制)=0000 0010(1+1进一位)
-1字节(Byte)有8个二进制位(8bit),以后的笔记某些地方会省略前面的0000
-8(十进制)= 1000(二进制)、10(十进制)=1010(二进制)
-自己动手丰衣足食:自己写下1-10的二进制位加强记忆吧
1110100101(二进制)怎么算呢?
发现规律:2是10、4是100、8是1000、16是10000、32是100000、64是1000000、128是10000000
解:题中数字有10位
∵最高位是1(9个0)+1(8个0)+1(7个0)+0+1(5个0)+0+0+1(2个0)+1
∵1000000000+100000000+10000000+0(第6位没有)+100000+0+0(第4,3位没有)+100+1
∴把上面的数转化为十进制:512+256+128+32+4+1=933
1234(十进制)怎么算呢?
按照上一个问题的2最大幂次方的数字相加的方式,把题目数字加满为止
1234=1024+128+64+16+2 = 10011010010(1024有10个0,128有7个0,所以最前位是1001)
-自己动手丰衣足食:自己想一个二进制和一个十进制,分别把他们转化一下吧
与运算 &
(对比的)两位都是1,结果才为1
0&0=0; 0&1=0; 1&0=0; 1&1=1;
例如:51&5 即转化为二进制进行对比↓
0011 0011 & 0000 0101 = 0000 0001 ; 因此:51&5=1
*特殊用法:
1)清零:将一个单元清零,只需跟个位为0的数值相“与”
2)取一个数的指定位,只需1相“与”即可获得
例:设X=10101110,取X的低4位(最后4位),用X & 0000 1111 = 0000 1110即可得到低4位。排除不需要的位数,与1进行“与运算”即可得到正确的值。
或运算 |
只要有一个为1,结果为1
0|0=0; 0|1=1; 1|0=1; 1|1=1;
例如:51&5
0011 0011 | 0000 0101 = 0011 0111 ; 因此51|5=55
*特殊用法:
1)把一个数值指定位变1,与1“相或”
例:将X=1010 0000的低4位为1,用X | 0000 1111 = 1010 1111即可得到。
异或运算 ^
两个对应位为“异”(不同),结果为1,相同为0
0^0=0; 0^1=1; 1^0=1; 1^1=0;
例如:51^5
0011 0011 ^ 0000 0101 = 0011 0110 ; 因此51^5=54
*特殊用法:
1)使特定位数翻转,与1“异或”
例:X=1010 1111,使X低4位翻转,X^0000 1111=1010 0001即可得到。
2)保留原值,与0“异或”
例:X=1010 1111,使X保留原值,X^0000 0000 = 1010 1110即可得到。
3)两数交换
a=01,b=10,a^b=11,c=11(出现规律) 01^10=11; 11^01=10; 11^10=01;
即
a^b=c; c^a=b; c^b=a;
将两数异或的结果与其中一个数再进行异或,可以得到另一个数。
尝试一下将:12^34异或之后,再用得到的值与12或34再进行异或吧。
取反运算 ~
一个二进制数按位取反,将0变1,1变0
~1=0; ~0=1;
左移运算 <<
将一个运算对象的每个二进制位全部左移X(指定)位(最左位丢弃,右边补0)
2<<1=4 等值于 0000 0010 << 1 = 0000 0100 11<<2=44 →等值于→ (1011)<2=(0010 1100);
11 = (0000 0000 0000 0000 0000 0000 0000 1011) 为32bit
-1 = (1111 1111 1111 1111 1111 1111 1111 1111) 为32bit
-14 = (1111 0011) << 2 解:采用 [取反补1] ∵-14取绝对值|14|,原码为0000 1110,反码为1111 0001,补码+1为1111 0010 ∴-14<<2 = 1111 0010<<2 = 1100 1000;
*不用担心,下面马上就会详细讲解上面的意思,并有测验帮助理解
*每左移一位相当于×2。0100(4)左移1位=1000(8)
右移运算 >>
将一个运算对象的每个二进制位全部右移X位(正数左补0,负数左补1,右边丢弃)
例1:9>>2 =
*每右移一位相当于÷2。1000(8)=右移1位=0100(4)
无符号右移运算 >>>
整体向右移动指定位数,(左边空位用0填充,右边丢弃)
-14 >>> 2 = 1073741820 (11111111111111111111111111110010) >>> 2 = (00111111111111111111111111111100) = 1073741820
—————————————————————————————————
原码:一个整数的绝对值大小转换为二进制称为原码
反码:将二进制数按位取反,所得的新二进制数与原二进制数互为反码
补码:反码+1称为补码
如何获得负数(十进制)的二进制数?先取负数的绝对值,然后取反码+1
如何获得负数(二进制)的十进制数?补码-1得到反码,反码取反得到原码
-自己动手丰衣足食:-99<<2的二进制是多少?
-自己动手丰衣足食:-1101011的十进制是多少?
JAVA内置进制转换
十进制 转换成 十六进制 | integer.toHexString(int i) |
十进制 转换成 八进制 | integer.toOctalString(int i) |
十进制 转换成 二进制 | integer.toBinaryString(int i) |
十六进制 转换成 十进制 | integer.valueOf(“FFFF”,16).toString() |
八进制 转换成 十进制 | integer.valueOf(“376”,8).toString() |
二进制 转换成 十进制 | integer.valueOf(“0101”,2).toString() |
*int i 写转换的数字
*FFFF和376和0101必须严格按照进制的数值来填写,否则会报错
JAVA中的数据类型
JAVA语言应用于高层,C语言应用于底层,进制转换在跨平台中和网络程序中运用的较多,如:文件读写,数据通信。
int数据类型有:byte(8bit,-128~127)、short(16bit)、int(32bit)、long(64bit)
float数据类型有:单精度(32bit float)、双精度(64bit double)
boolean类型变量的取值有:true、false(1bit)
char数据类型有:unicode字符(16bit)
对应的[类]类型
Integer、Float、Boolean、Character、Double、Short、Byte、Long
JAVA数据类型 转化为 字节
如何在内存中对这些字节进行排序:大端法(Big-endian)和小端法(Little-endian)
· 先取高字节的数据存放在低地址,低字节存放在高地址,则是大端法
· 先取低字节的数据存放在低地址,高字节存放在高地址,则是小端法
*不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址。
*大端法或小端法是数据在存储时的表现,而不是在寄存器中参与运算时的表现。
例如0x0A0B0C0CD的在大端和小端中的存放方式分别为:
______________________________________________________________
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)
问答1:按照【?】方式存放在内存中呢?
______________________________________________________________
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)
问答2:按照【?】方法存放在内存中呢?
______________________________________________________________
最后关于数据转化的代码:
package com.radix.byteoperator;public class Convert { /* * int转化为byte[] */ public static byte[] int2Bytes(int id){ //int为32位 4字节,创建length为4的byte数组 byte[] arr = new byte[4]; arr[0] = (byte)((int)(id>>0*8) & 0xff); arr[1] = (byte)((int)(id>>1*8) & 0xff); arr[2] = (byte)((int)(id>>2*8) & 0xff); arr[3] = (byte)((int)(id>>3*8) & 0xff); return arr; } /* * byte[]转化为int */ public static int byte2int(byte[] arr){ int i0 = (int)((arr[0] & 0xff)<<0*8); int i1 = (int)((arr[1] & 0xff)<<1*8); int i2 = (int)((arr[2] & 0xff)<<2*8); int i3 = (int)((arr[3] & 0xff)<<3*8); return i0+i1+i2+i3; } public static void main(String[] args){ byte[] int2byte = Convert.int2Bytes(8143); for(byte b:int2byte){ System.out.println("---->"+b); } int byte2int = Convert.byte2int(int2byte); System.out.println("<----"+byte2int); } }
热门评论
感谢总结,但关于原码反码补码这一块是有误的