JavaSE——【运算符】(二)

目录

前言

一、二进制和进制转换

二、原码、反码、补码

三、位运算符

四、移位运算

五、运算符的优先级

总结


前言

    2024年某一天,外星人入侵了地球,想要征服和奴役人类,但外星人对奴役的定义是这样的:每周让人类工作12个小时,同时会提供健康的食物,住所和娱乐方式。但却遭到了人类的顽强抵抗,外星人十分不解,立即抓来人类反抗领导者反复询问原因,但他却闭口不谈,最终在三天的软禁后,反抗领导者终于招了:"奴役的日常生活没有学习Java,他们誓死反抗!"

    看来大家对Java的热情如此之高,小奥奇就带领大家学习剩余的操作符相关内容。


一、二进制和进制转换

    其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。

    比如:数值15的各种进制的表示形式:

15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F

  我们重点介绍⼀下二进制:

    首先我们还是得从10进制讲起,其实10进制是我们生活中经常使用的,我们已经形成了很多尝试:

    10进制中满10进1

    10进制的数字每⼀位都是0~9的数字组成其实二进制也是⼀样的

    2进制中满2进1

    2进制的数字每⼀位都是0~1的数字组成 那么 1101 就是二进制的数字了。 

1.1 二进制转十进制

    其实10进制的123表示的值是⼀百二十三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进制的数字从右向左是个位、十位、百位....,分别每一位的权重是 10 , 10^2 , 10^3 ..

    2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是: 2^0 , 2^1 , 2^2 ... 如果是2进制的1101,该怎么理解呢? 

1.2 十进制转二进制

1.3 二进制转八进制和十六进制

1.3.1 二进制转八进制

    8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就足够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。

    如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。

1.3.2 二进制转十六进制 

     16进制的数字每⼀位是0~9,a ~f 的,0~9,a ~f的数字,各自写成2进制,最多有4个2进制位就⾜够了, 比如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个二进制位的直接换算。

    如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前面加0x


二、原码、反码、补码

    整数的2进制表示方法有三种,即原码、反码和补码

    有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。

    符号位都是用0表示“正”,用1表示“负”。

    正整数的原、反、补码都相同

    负整数的三种表示方法各不相同。

    原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

    反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

    补码:反码+1就得到补码。

    注意:反码得到原码也是可以使用:取反,+1的操作

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?

在计算机系统中,数值⼀律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。


三、位运算符

      Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。

      位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。

      位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.

3.1 按位与 &:

    如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.

int a = 10;
int b = 20;
System.out.println(a & b);

    进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100 :

3.2 按位或 |:

    如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.

int a = 10;
int b = 20;
System.out.println(a | b);

    运算方式和按位于类似:

    注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算. 

3.3 按位取反 ~:

    如果该位为 0 则转为 1, 如果该位为 1 则转为 0

int a = 0xf;
System.out.printf("%x\n", ~a)

  注意:

      \bullet 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字  对应 4 个二进制位.

      \bullet 0xf 表示 10 进制的 15, 也就是二进制的 1111

      \bullet printf 能够格式化输出内容, %x 表示按照十六进制输出.

      \bullet \n 表示换行符 

3.4 按位异或 ^:

    如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.

int a = 0x1;
int b = 0x2;
System.out.printf("%x\n", a ^ b);

    注意:如果两个数相同,则异或的结果为0

奥奇小课堂:”小奥奇听说使用异或运算符能够在不创建第三个变量时,使其余两个变量的值偷偷交换,当然只是传闻。“ 


四、移位运算

    移位运算符有三个: <<  >>  >>> ,都是二元运算符,且都是按照二进制比特位来运算的。

4.1. 左移 <<:

    最左侧位不要了, 最右侧补 0

int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20

    注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数

4.2. 右移 >>:

    最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)

int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果(注意, 是按十六进制打印的)
8
int b = 0xffff0000;
System.out.printf("%x\n", b >> 1);
// 运行结果(注意, 是按十六进制打印的)
ffff8000

4.3. 无符号右移 >>>:

    最右侧位不要了, 最左侧补 0.

int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff

注意:

    1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.

    2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.

    3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.

    4. 移动负数位或者移位位数过大都没有意义 


五、运算符的优先级

    在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,

    比如:* 和 / 的优先级要高于 + 和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。

// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c)

    上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果为10。

注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.


总结

    小奥奇突然明白,人类为什么想要学习Java,他们学习运算符后,入侵了外星人的系统和智能武器,并且成功的抵抗了外星人的进攻,但小奥奇好像看见一个外星人偷偷溜回宇宙了,未完待续……

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值