[Java教程]9.二进制,位运算,原码,反码,补码

Java教程专栏:https://blog.csdn.net/qq_41806966/category_9929686.html

这一篇将会了解一下计算机底层,二进制.


目录

 

二进制

二进制与十进制互相转换

机器数和真值

原码

反码

补码

为什么需要原码补码反码?

位运算


二进制

什么是二进制?

二进制是计算技术中广泛采用的一种数制

我们通常使用的都是十进制,也就是逢 10 进 1,那么二进制自然就是 逢 2 进 1.

十进制的每一位只能为 0,1,2...9, 二进制的每一位 只能是 0 或 1,

 

计算机底层计算使用的是二进制(没有学过二进制,数学比较差可能理解比较难)

也就是说,我们电脑里的文件其实都是由一堆 0 和 1组成

二进制与十进制互相转换

先列举二进制与十进制的一些基本数字, 0 到 11(借此了解一下二进制与十进制的关系)

十进制(逢10进1)01234567891011
二进制(逢2进1)0110111001011101111000100110101011

十进制转二进制 计算方法为

例: 将 57 转为二进制

先计算

57 / 2 = 28 余 1(2 * 28 = 56 相比 57 还剩下 1,1就是余数)
28 / 2 = 14 余 0(28 可以被 2整除)
14 / 2 = 7 余 0
7 / 2 = 3 余 1
3 / 2 = 1 余 1
1 / 2 = 0 余 1
所以 57 转 2 进制的结果为 111001(余数,从下往上)

画张图就是这样的

所以 57 的二进制表示形式为 111001

二进制转十进制

公式为 从左到右,第一位乘二的 二进制位数-1次方(次方就是多少个2相乘) 加上 第二位*2的 二进制位数 - 2次方 一致到最后(乘2的0次方,0次方为1)

例: 将 1101 转为十进制

(这里的 ^ 代表次方)
1101(二进制) = 1 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0
=8 + 4 + 0 + 1
=13(十进制)

 

在了解了二进制后就好理解原码,反码,补码了.

机器数和真值

机器数就是一个数在计算机中的二进制表示形式.机器数是带符号的(使用最高位也就是数字最左边的那个数作为符号位)

计算机字长为八位

例:

1的机器数表示为 0000 0001

-1的机器数表示为 1000 0001

真值就是符号位后的数值

原码

原码就是我们认识的二进制码(没有做任何操作的),也就是我们上面计算的二进制码.

有符号的前提下,最高位为符号位,其余各位为数值本身的绝对值,无符号就是数据的绝对值,计算机的原码用于表示有符号整数中的正数,以及无符号整数

反码

  • 正数:反码与原码相同
  • 负数:符号位为1,其余位对原码取反
    • 例如 -2 的原码为 1000 0010
    • 反码为 1111 1101(0变1 1变0就是取反)

补码

  • 正数:原码,反码,补码相同
  • 负数:最高位为1,其余位为原码取反,在对整个数加一
    • 例如 -2 的反码为 1111 1101
      • 补码为 1111 1110(逢2进1)
    • 可以得出 反码 = 补码 - 1
  • 在计算机系统中,数值一律用补码来表示(正数与原码一样可以理解为按照原码解析,负数都是补码)

为什么需要原码补码反码?

对于计算机来说,需要辨别符号位会让计算机的基础电路设计变得十分复杂.

于是就有了让符号位也参与运算的想法(计算机中可以只有加法,没有减法,因为 1 - 1 等价于 1 + (-1)).

这样,就让计算机运算的设计变得更简单了.

补码减法可以按加法算 如果最高位(符号位)有进位,则进位被舍弃

补码计算只需要一步 将二进制数值进行相加

原码则需要三步 检测符号 -比较绝对值的大小 -计算

补码比原码快三倍

位运算

什么是位运算?

计算机对于二进制数据进行的运算都叫位运算(+,-,*,/这些也是位运算)

在 Java 中,拥有以下位运算符号.

符号描述运算规则
&两个位都为1时,结果才为1
|两个位其中有一个为1,结果为1
^异或两个位相同为0,相异为1
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

接下来用例子一一列举结果

  • & 按位与(两个数比较的时候,同一位都为1时,结果才为1,在键盘的上面小数字8的位置,要先按下shift)
    • 比如 2 和 1 进行 & 操作
    • 2 & 1 = ?
    • 2转为二进制为 10,1转为二进制为 01(为了与2的二进制对其 加个0)
      • 10
      • 01
    • 同一位为1结果为1,否则为0 所以结果为
      • 00
    • 2 & 1 = 0
  • | 按位或(同一位只要有一个为1,结果为1,否则为0,在键盘的反斜杠处,不同键盘位置不同...)
    • 2和1进行 | 操作
    • 2 | 1 = ?
      • 10
      • 01
    • 任意一位为1,结果为1
      • 11
    • 2 | 1 = 3
  • ^ 按位异或(同一位相同则为0,不同为1,键盘上方的数字键 6,要按shift)
    • 2 ^ 1 = ?
      • 10
      • 01
      • 11
    • 2 ^ 1 = 3
    • 结果与或相同?再来一个例子 3 ^ 3 = ?
      • 11
      • 11
      • 00
    • 3 ^ 3 = 0
  • ~ 按位取反(0 变 1,1 变 0,只针对一个数,在键盘的左上角 数字键一排的最左,要先按 shift)
    • ~3 (转为二进制 八位)
      • 0000 0011
    • 取反后
      • 1111 1100
    • ~3 = -4
  • << 左移(往左移指定位,空位填0,就是两个小于号)
    • 1 << 1(1 往左移动 1 位)
      • 移动前
        • 1
      • 移动后
        • 10
    • 1 << 1 = 2
    • 可以通俗理解,左移1位就是乘以2,两位就是乘以2*2,以此类推
  • >> 右移(往右移动指定位,空位填0,两个大于号)
    • 1 >> 1 = 0
    • 4 >> 1
      • 移动前
        • 100
      • 移动后
        • 010
    • 4 >> 1 = 2
    • 可以理解为,右移一位就是除以2,两位就是除以2*2,以此类推
  • 左移右移操作比乘除快.

能用左移和右移替换乘法和除法尽量用左移右移.

勤学多练,就是学习技巧.

下一节我们将学习Java中的字符串.

请继续关注此专栏.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HackShendi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值