第一点是:反码与按位取反~

在Java中~符号是按位取反,例如,~5=-6。-5=4.  快速计算:一般~可以直接用(a+1)算,正数负数均可

思路:

是按位取反运算,与反码是不同的,
反码法规定,正数原反补码相同,负数的反码为原码除符号位以外取反。
而按位取反运算中:正数取反是先将初始数值转换成二进制数(6==》00000110),再对二进制数的每一位取反:即将0变为1、将1变为0。(00000110==》11111001),得到的是最终结果的补码,要转换为最终结果的原码则需再次取补码,(此处一种逆着算为11111001-1除符号位全取反10000111即为-7,另一种为11111001==》10000110+1==》10000111也为-7)就能得到计算结果。
负数取反:先将初始数值转换成二进制数(以-6为例,10000110),再取得二进制数的补码(10000110==》11111001+1==》11111010),之后对补码的每一位取反:即将0变为1、将1变为0(11111010==》00000101即为5)。得到的是最终结果的补码(由于正数的原码、反码、补码相同,该数即为原码),要转换为最终结果的原码则需再次取补码,就能得到计算结果。

注:在计算机中,运算都是通过补码进行计算的,这个点也是今晚我一直想不到的点,以至混淆了概念,胡乱取反。

第二个点是:IO流方面

IO流分为字节流(0-255)和字符流(0-65535)。

字节流:InputStream与OutputStream,这两个类都是抽象类,不能直接new,可以通过子类来new,FileInputStream、FileOutputStream.

字符流:Reader与Writer   子类InputStreamReader、OutputStreamWriter

转换流,字节流可以转换成字符流,JDK提供了两个人将字节流转换为字符流,分别是:InputStreamReader、OutputStreamWriter.

socket传输信息都是以二进制形式传输,也就是字节流进行处理。当传输到客户端或者服务端,如果数据比较大,就不能使用字节流来存储,需要包装一下字节流,将字节流装换成字符流,在字符流中还可以将信息放到缓存区,也就是BufferReader与BufferWriter中。

注意一点:FileWriter创建来一个输出流对象out,out.write(s)是把字符串s输进了流里,并没有输出到文件中,你必须调用out.flush()方法讲流中数据冲进目标文件,注意,io流用完后要记得用close()方法关闭,否则将有意想不到的麻烦,另外close()方法也具有flush()的作用。

 

第三个点是很多报文里头需要占据不止8位(一个字节)的空间,需要用位才做来存放,

int result = b1<<8+b2;//这个方法可以得到b1与b2共16位返回的值。