Java娘的整数运算¶
本章评级
四则运算¶
Java娘作为一种编程语言,自然 支持四则运算,并且可以任意增添小括号,与小学时学的初等数学一致。
毕导:我们在小学二年级就学过的...1
举个栗子:
public class Main {
public static void main(String[] args) {
int i = (500 + 114) * (99 - 88);
int n = 9 * (6 + (i - 21));
System.out.println(i);
System.out.println(n);
}
}
举个栗子:
int x = 114514 / 1919; //x = 59
%
int x = 2345 % 67; //x = 17
运算符¶
运算符用在数学表达式中,它们的作用与在数学中的作用一致,下表列出了所有的算术运算符。 《小 学 数 学》
下表中假设有两个变量,a和b,它们的值分别为10和20。
运算符 | 描述 | 栗子 |
---|---|---|
+ |
加法 | a+b=30 |
- |
减法 | b-a=10 |
* |
乘法 | a*b=200 |
/ |
除法 | b/a=2 |
% |
取余数 | b%a=0 |
++ |
自增(在原数的基础上+1) | a++ = 11 |
-- |
自减(在原数的基础上-1) | a-- = 9 |
Java娘温馨提示
非常不建议在四则运算中使用自增和自减,因为这非常容易把你们这群人类搞懵。
注意
++
和--
写在前面和后面所求出来的结果是不同的Kora2!!!
易错
int a = 10;
a = a++;
首先a++的取值结果为10, 然后a进行自增,此时a=11,最后进行赋值 ,所以最后输出 a的值为10.
实际上,以上的代码作用相当于:
int a = 10;
int x = a;
a = a + 1;
a = x;
System.out.println(a);
关于a++与++a的区别
这个的区别实际上非常好认定,我们先来看一段超~简单的代码:
public class Main {
public static void main(String[] args) {
int a = 1;
int x = 1;
a = a++;
x = ++x;
System.out.println(a);
System.out.println(x);
}
}
1
2
a++是使用a后,再进行+1,++a是先进行+1,再使用a
运算溢出¶
由于整数娘存在范围限制,如果计算超出了限制,就会导致溢出。溢出不会出错,但会得出一个奇怪的结果。
举个栗子:
public class Main {
public static void main(String[] args) {
int x = 2147483640;
int y = 15;
int z = x + y;
System.out.println(z); // -2147483641
}
}
编译上述内容就会发现......正数加正数等于负数!?好家伙,直接溢出
这就是溢出。为了解决上面的问题,可以将int
换为long
。 真是TMD烦死了。3
位运算¶
我们在小学二年级就学过....不,这个真没学过
位运算是按与,或,非以及异或的运算。本质上是按位对齐,随后依次对每一位进行运算。
举个栗子:
public class Main {
public static void main(String[] args) {
int i = 167776589; // 00001010 00000000 00010001 01001101
int n = 167776512; // 00001010 00000000 00010001 00000000
System.out.println(i & n); // 167776512
}
}
与运算娘¶
与运算娘的规则是:必须两个数同时是1
,结果才是1
,否则为0
。
举个栗子:
n = 0 & 0; //n=0
n = 0 & 1; //n=0
n = 1 & 1; //n=1
或运算娘¶
或运算娘的规则是:只要两个数中有一个是1
,结果就是1
。
举个栗子:
n = 0 | 0; //n=0
n = 0 | 1; //n=1
非运算娘¶
非运算娘的规则是:0和1互换。
举个栗子:
n = -0; //n=1
n = -1; //n=0
异或运算娘¶
异或运算的规则是:如果两个数不同,结果是1
,否则为0
举个栗子:
n = 0 ^ 0; //n=0
n = 0 ^ 1; //n=1
n = 1 ^ 1; //n=0
移位运算¶
我们之前知道,在计算姬中,整数总是以二进制形式存储。
可以对整数进行移位运算。对整数7左移1位将得到整数14,左移两位将得到整数28
举个栗子:
int n = 7; // 00000000 00000000 00000000 00000111 = 7
int a = n << 1; // 00000000 00000000 00000000 00001110 = 14
int b = n << 2; // 00000000 00000000 00000000 00011100 = 28
int c = n << 28; // 01110000 00000000 00000000 00000000 = 1879048192
int d = n << 29; // 11100000 00000000 00000000 00000000 = -536870912 (溢出)
那对负数右移呢?
int n = -536870912;
int a = n >> 1; // 11110000 00000000 00000000 00000000 = -268435456
int b = n >> 2; // 11111000 00000000 00000000 00000000 = -134217728
int c = n >> 28; // 11111111 11111111 11111111 11111110 = -2
int d = n >> 29; // 11111111 11111111 11111111 11111111 = -1
如果对一个负数进行右移,最高位的1不动,结果仍然是一个负数。
还有一种无符号的右移运算,使用>>>,它的特点是不管符号位,右移后高位总是补0,因此,对一个负数进行>>>右移,它会变成正数,原因是最高位的1变成了0:
int n = -536870912;
int a = n >>> 1; // 01110000 00000000 00000000 00000000 = 1879048192
int b = n >>> 2; // 00111000 00000000 00000000 00000000 = 939524096
int c = n >>> 29; // 00000000 00000000 00000000 00000111 = 7
int d = n >>> 31; // 00000000 00000000 00000000 00000001 = 1
对byte和short类型进行移位时,会首先转换为int再进行位移。
仔细观察可发现,左移实际上就是不断地×2,右移实际上就是不断地÷2。