手记

关于JAVA入门二进制课程的笔记

由于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);
	}
}
0人推荐
随时随地看视频
慕课网APP

热门评论

感谢总结,但关于原码反码补码这一块是有误的

查看全部评论