计算机基础+java 位运算(带例子)

前言

-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚当爱上Coding&&Studying的那一刻…
-🏃‍放弃不难,但坚持一定很酷。


一、计算机基础概念

1️⃣机器数

机器数:即是有符号的二进制数,0表示正数,1表示负数

+5:计算机字长为8位,二进制数:00000101

-1:计算机字长为8位,二进制数:10000101(原码)

2️⃣真值

由于机器数第一位表示的是符号位,所以其形式值不是真值的数值。

例如1000101表示的是-5而不是133(1000101的十进制是133,前提是第一位不是符号位),因此,-5才是机器数的真值。

3️⃣原码

原码是一种计算机中的数字的二进制的定点表示方法。

原码表示法在数值的前一位增添了一位符号位,0表示正数,1表示负数。(即平时所说的第一位表示符号位,即有符号数)

[+5] = [00000101](原码)

[-5] = [10000101](原码)

注意:因为第一位表示的是符号,所以8位数的二进制的取值范围时[-127,127]。

无符号数(即是第一位不表示符号),其8位数的二进制的取值范围时[0,256]。

4️⃣反码

反码的表示方法:

  • 正数的反码是其本身

  • 负数的反码是在原码的基础上,符号位不变,其余全部取反

[+5] = [00000101](正数的反码是其本身)

[-5] = [11111010](负数:除符号位不变,其余全部取反)

5️⃣补码

在计算机系统中,数值统一用补码来表示和存储。

原因:使用补码,可以将符号位和数值域统一处理,同时加法与减法也可以统一处理。

补码的表示方法:

  • 正数的补码就是其本身

  • 负数的补码表示方法就是在原码的基础上,除符号位不变外,其余全部取反,最后加一。

[+5] = [00000101](原码) = [00000101](反码) = [00000101](补码)

[-5] = [10000101](原码) = [11111010](反码) = [11111011](补码)

二、java位运算

位移操作:(只针对 int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).

当然也可作用于以下类型,即 byte,short,char,long(它们都是整数形式)。当为这四种类型时,JVM会先把它们转换成int型再进行操作。

1️⃣左移(<<)

m << n的含义:将整数的二进制数左移n位,高位移出n位都舍弃,低位补0;(会出现正数变负数的操作)

eg:

5<<2 :把十进制的数值5左移两位,按如下步骤计算,

把5转位16位的二进制机器数:00000000 00000000 00000000 00000101

按左移原理,将二进制数左移两位:00000000 00000000 00000000 00010100

左移后结果为20

5<<29:把十进制的数值5左移29位,按如下步骤计算,

把5转位16位的二进制机器数:00000000 00000000 00000000 00000101

按左移原理,将二进制数左移29位:10100000 00000000 00000000 00000000

左移后高位是1,结果显然是负数。

小结:m<<n在没有数字溢出的情况下,对于正数和负数,左移n位都相当于m乘以2的n次方。

2️⃣右移(>>)

m>>n的含义:将整数的二进制数右移n位,低位移出n位都舍弃,高位补0;

eg:

5>>2 :把十进制的数值5右移两位,按如下步骤计算,

把5转位16位的二进制机器数:00000000 00000000 00000000 00000101

按右移原理,将二进制数左移两位:00000000 00000000 00000000 00000001

右移后结果为1

-5>>2:把十进制的数值-5右移两位,按如下步骤计算,

把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011

按右移原理,将二进制数右移两位:11111111 11111111 11111111 11111110

右移后结果为-2

小结:m>>n即相当于m除以2的n次方,得到有以下两种情况:

  • 整数:即为结果

  • 小数:

    • 正数:会直接舍弃小数位,整数直接返回。

    • 负数:舍弃小数位,整数部分+1返回。

3️⃣无符号右移(>>>)

m>>>n:整数m表示的二进制小数,不论正负数,高位都补0;

eg:

5>>>2 :把十进制的数值5右移两位,按如下步骤计算,

把5转位16位的二进制机器数:00000000 00000000 00000000 00000101

按右移原理,将二进制数左移两位:00000000 00000000 00000000 00000001

右移后结果为1

-5>>>2:把十进制的数值-5右移两位,按如下步骤计算,

把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011

按右移原理,将二进制数右移两位:00111111 11111111 11111111 11111110

右移后结果为正数

4️⃣按位非操作(~)

~表示按位取反操作符,对每个二进制的内容取反,即1变0,0变1;

eg:

  • 把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011

  • ~(-5) 取反结果:00000000 00000000 00000000 00000100

  • 转为十进制,结果为4

5️⃣按位与操作(&)

& 位与操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0。

1&0=0

0&0=0

1&1=1

0&1=0

eg:

-5 & 4

-5的二进制形式为: 11111111 11111111 11111111 11111011

4的二进制形式为: 00000000 00000000 00000000 00000100

——————————————————————————————

逻辑与运算结果: 00000000 00000000 00000000 00000000

最终结果为0。

6️⃣按位或操作(|)

| 位或操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1。

1|0=1

0|0=0

1|1=1

0|1=1

eg:

-5 | 4

-5的二进制形式为:11111111 11111111 11111111 11111011

4的二进制形式为:00000000 00000000 00000000 00000100

————————————————————————————

逻辑或运算结果: 11111111 11111111 11111111 11111111

最终结果为-1。

利用或的原理可以将字节转化成整数,-64|0xFF = 192,其中0xFF表示整数255。

7️⃣按位异或操作(^)

^ 异或操作符,相同位值为0 否则为1。

1^1=0

1^0=1

0^1=1

0^0=0

eg:

-5 ^ 4

-5的二进制形式为:11111111 11111111 11111111 11111011

4的二进制形式为:00000000 00000000 00000000 00000100

————————————————————————————

逻辑异或运算结果: 11111111 11111111 11111111 11111111

最终结果为-1。

重点:异或操作有个重要的作用就是判断两个数值是否相等,如6^6=0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BXuan随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值