日期:2018.10.07
星期五
博客期:014
一、Java中的位运算
代码如下:
1 package Morts107; 2 3 public class Test107 { 4 public static void main(String[] args) { 5 int z; 6 z = 13>>1;//00001101(13)----------------[右移1位]-------------->00000110(6) 7 System.out.println(" z = "+z); 8 z = 45>>2;//00101101(45)----------------[右移2位]-------------->00001011(11) 9 System.out.println(" z = "+z); 10 z = 6<<1;//00000110(6)------------------[左移1位]-------------->00001100(12) 11 System.out.println(" z = "+z); 12 z = 11<<2;//00001011(11)----------------[右移2位]-------------->00101100(44) 13 System.out.println(" z = "+z); 14 z = -1>>2;//10...0000001(-1)----------------[左移1位]-------------->10...010(-2) 15 System.out.println(" z = "+z); 16 } 17 }
本程序实现了int类型数值的位运算,如代码中的注释一样,计算机只能储存1和0,所以说这些数都是二进制的!而二进制的13就是(…001101),让它向右位移1位,自然就成了6(…00110),即13>>1==6成立,所以位运算就是这样!<<和>>分别表示左移和右移,而右边的操作数就是位置移动的数的大小!如11(…01011)左移2位,就是44(…0101100),即11<<2==44成立;这就相当于<<是这个数除以(2的后操作数次方)的结果,而>>就相当于是乘以(2的后操作数次方)的结果!而对于负数来说,它的第一位是1,所以负数最大也就是-1,-1/2也相当于-1!
正整数的原码、反码和补码都一样;
负数部分:
原码和反码的相互转换:符号位不变,数值位按位取反
原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1
二、数据类型所占的位数
Byte 1 字节 (8bit)
Char 2 字节 (16bit)
Short 2 字节 (16bit)
Int 4字节 (32bit)
Float 4字节 (32bit)
Long 8字节 (64bit)
Double 8字节 (64bit)
说明了一个问题:取值范围小的可以往取值范围大的类型转(浮点类型所表示范围较大),在非浮点类型转换到浮点类型时一定会失去一部分精度!
三、测试题目
结果如下:
结论:枚举类型与String类不同,可以直接用==、!=来判断关系!
掌握了!
四、运行代码
结果如下:
不意外,因为float和double都是浮点类型,是不精确的!
五、实验
#:以下代码的输出结果是什么?
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
@:
#:为什么会有这样的输出结果?
String类的+是相当于StringBuffer类中的append()函数,就是因为这个原因,System.out.println(”I love”+” China!”);实际上和System.out.println(“I love China!”);是一个效果,而在X和Y(两个整形int的数据)相加时,自然是调用它们自己的加法函数了!)