进制
- 十进制
- 二进制Binary:0b、0B开头;
- 八进制octal: 0开头
- 十六进制: 0x或者0X开头;
二进制表达式
- 一个字节,最高位是符号位:0标识正数,1表示负数;
- 计算机底层使用补码的方式进行存储(但是是靠着原码进行计算十进制);
- 正数的三码合一;负数并不是;
十进制转二进制,除2取余的逆;
补码有误
运算符
1、算数运算符;
public static void main(String[] args) {
String s1 = "123123";
// System.out.println(s1 - 1); //字符串不能和int类型直接进行运算;
char c1 = 'a';
String s2 = s1 + c1;
System.out.println(s2); // "123123a"
double d1 = 10;
int d2 = 3;
double d3 = d1 / d2;
System.out.println(d3);
}
- (1)、除法;
/; **除法的结果类型,需要看除数和被除数的类型;
int i1 = 2;
int i2 = 3;
double d1 = i1 / i2; //可以;
System.out.println(d1);
int i3 = i1 / i2;
System.out.println(i3);//也可以;
i++;和++i;在字节码中的没有区别;
实际中只有先自增和后自增的区别;
short s1 = 10;
s1 = (short)(s1 + 1); //此处必须要强制转换;等同于s1++;
s1++;
- (2)模: % ;取模的结果符号和除数的符号相同: 12 % -5 = 2; -12 %-5 = -2;
public static void main(String[] args) {
short s1 = 10;
s1 = (short)(s1 -1); //s1--;
System.out.println(s1);
s1--;
System.out.println(s1);
--s1;
System.out.println(s1);
// 取一个证书的个十百千位;
int num = 123;
int ge = num % 10;
int s = num % 100 / 10;
int b = num / 100;
System.out.println(ge);
System.out.println(s);
System.out.println(b);
// 89是多少天,多少时;
int hour = 89;
int day = hour / 24;
int hou = 89 % 24;
System.out.println(day);
System.out.println(hou);
//
String str = "5+5=" + 5+5; //5+5=55;
String s2 = "5+5=" + (5+5); //5+5=10;
System.out.println(str);
System.out.println(s2);
byte b1 = 127;
b1++;
System.out.println(b1);//-128;
int i5 = 1;
int i6 = i5++ + ++i5 * i5++;
// 1 + 3 X 3;
System.out.println(i6); // 10;
int m = 2;
m = m++;
System.out.println(m); //2
//m = ?
// m = 2;----
int j = 2;
j = ++j;
System.out.println(j); //3
}
2、赋值运算符
特例
public static void main(String[] args) {
//连续赋值;
int a,b;
a = b = 10;
// 其他方式;
int a1 = 20,
b1 = 30;
/* += */
byte bt = 10;
bt += 5; //5虽然是int类型,但是没有报错;此种赋值方式不会改变数据类型;
//如果写成 bt = bt + 5;会编译报错;
System.out.println(bt); //15
byte bt2 = 3;
bt2 += bt;
System.out.println(bt2); //18
}
3、比较、关系运算符
- 比较运算符
== 、 > 、 != 、 >= 、 instanceof(面向对象,多态中使用);
Boolean b1 = true > false; // 不能比较;
(除==、=外布尔类型不能参与到其他七中基本类型的比较中)
public class Compare {
public static void main(String[] args) {
// boolean b0 = (true > false); // ܱȽϣ
boolean b1 = 2 > 1;
System.out.println(b1);
int i0 = 10;
System.out.println(i0 = 20); //20;
}
}
- 逻辑运算符
a&b 和 a&&b 结果一样;
a|b
a||b
!a
a^b 异或;(真假不一样时为真,只要不一样则为true)
4、逻辑运算符
-
& 逻辑与,
- 前false符号后面也都执行;
false & a++; //a会加一;
- 前false符号后面也都执行;
-
&& 短路与;
- 前false符号后面不会执行;
false & a++; //a不会加一;
- 前false符号后面不会执行;
5、位运算符
都是针对数值类型的变量或常量;
- 1、<<; 左移;
// 每左移一位 原有基础乘以2;
0-0-0-0 -- 0-0-0-0 -- 1-1-1-1;(2^3+2^2+2^1+2^0);
0-0-0-0 -- 0-0-0-1 -- 1-1-1-0; 2*(2^3+2^2+2^1+2^0);
- 2、>>; 右移
- 正数高位补零,负数高位补一
- 每右移一位都除以2;
- 3、>>>;无符号右移
- 无论正负,高位补零-
- -负数瞬间变正
- 4、 &; 单与;
- 比较每一位
//1和1为1;1和0为0;0和0为0;
1 & 1; 1 & 0; 0 & 0;
- 5、 |; 单或;
- 比较每一位
//0和0为0;1和1,1和0为1;
1 | 1; 1 | 0; 0 | 0;
- 6、 ^; 异或;
- 两个不同为1, 相同为0;
- 7、 ~取反;
- 包括符号位全部取反;
6、条件运算符
一元,二元,三元运算符(条件运算符);
xx a = boolean ? 表达式1:表达式2;
表达式1和表达式2必须是同样的类型,或者可以相互转化(兼容)的类型;
比ifelse效率高一点点点点点
7、Lambda运算符
一元运算、二元运算、三元运算;(元指的是变量)
位运算应用,交换变量值
public static void main(String[] args) {
int num = 9;
int num2 = (num << 200);
System.out.println(num2);
System.out.println(num);
int num3 = (num >> 1);
System.out.println(num3);
// 交换变量的值;
// 1、中间变量;
// 2、先加到一起赋值给其中一个然后减去另一个;(只适用于数值类型、可能超出int范围)
int m = 10,
n = 20;
m = m + n;
n = m - n;
m = m -n;
// 3、位运算;异或;(只适用于数值类型)
m = m ^ n;
n = m ^ n;
m = m ^ n;
}
小结
计算金额,不适用float或者double;(精度不高);
使用bigDecimal;
boolean 变量分配空间时 占用一个槽位(slot)4个字节;
double、long占用两个槽位,其他的基本数据类型占据一个槽位;