跳转至

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的值是什么?11?实际上,a的值是10。

首先a++的取值结果为10, 然后a进行自增,此时a=11,最后进行赋值 ,所以最后输出 a的值为10.

实际上,以上的代码作用相当于:

int a = 10;
int x = a;
a = a + 1;
a = x;
System.out.println(a);
故,输出的a值为10.

关于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。


  1. 毕导是一位B站UP主,"我们在小学二年级就学过的xxx"是他节目的特色,然而,这些知识往往是高中乃至大学的知识。 

  2. Kora是一种语气词。 

  3. 郑爽和张恒关于孩子的录音事件。在录音当中郑爽说了一句“tmd烦死了,打又打不掉”。 


最后更新: 2021-08-06