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) 0 1 2 3 4 5 6 7 8 9 10 11 二进制(逢2进1) 0 1 10 11 100 101 110 111 1000 1001 1010 1011 十进制转二进制 计算方法为
例: 将 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中的字符串.
请继续关注此专栏.