🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:计算机组成原理
🌠 首发时间:2022年9月11日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🌟 一以贯之的努力 不得懈怠的人生
进制指进位制,是人们规定的一种进位方式
它表示某一位置上的数,运算时是逢 X 进一位。比如,十进制是逢十进一,二进制就是逢二进一,八进制就是逢八进一…
计算机数据在底层运算的时候,都是以二进制的形式进行的
也有数据是以八进制、十进制或者十六进制进行存储或运算,了解不同的进制,便于我们对数据的运算过程理解得更加深刻
我们都知道 ASCII 码,也知道 a 的 ASCII 码是 97,但是你知道它为什么是 97 吗?
运算规则:逢十进一,借一当十
十进制是我们很熟悉的进制了,毕竟我们从幼儿园就开始学习了,它的运算规则也很好理解了,其他进制的运算规则和十进制的大同小异
二进制数据就是用 0 和 1 两个数码来表示,例如:0000 0110
进位规则是“逢二进一”,借位规则是 “借一当二”
二进制的计算举例
加法:0011 + 1 = 0100
减法:0010 - 1 = 0001
很简单,是不是
八进制:采用 0,1,2,3,4,5,6,7 这八个数字来表示,逢八进一,借一当八
十六进制:用数字 0 到 9 和 字母 A 到 F(或 a ~ f)来表示,其中 A ~ F 表示 10 ~ 15,这些称作十六进制
我们在 Java 中使用一下
public class ScaleDemo {
public static void main(String[] args) {
System.out.println(10); //十进制
System.out.println(0b10); //二进制
System.out.println(010); //八进制
System.out.println(0x10); //十六进制
}
}
打印出来的结果如下:
公式:系数 * 基数的权次幂,然后相加
这样说可能不是特别直观,我们来看一个具体的例子,比如 0b100,这个数的十进制是多少呢?
首先,0b 表示这个数为二进制形式
系数 * 基数的权次幂如下:
第一位:0 * 20 = 0
第二位:0 * 21 = 0
第三位:1 * 22 = 4
然后相加,0 + 0 + 4 = 4,结果就是 4 了
注意:上面的公式同样适用于八进制转十进制、十六进制转十进制
公式:除基倒取余
解释:使用源数据,不断地除以基数(几进制,就是几)得到余数,直到商为 0,再将余数倒着拼起来即可
比如,将十进制数字 11,转换为二进制,它的实现方式如下
将源数据 11 不断地除以基数 2,直到商为 0,结果为 1011
注意:上面的公式同样适用于十进制转八进制、十进制转十六进制
8421 码又称为 BCD 码,是 BCD 代码中最常用的一种
BCD:Binary-Coded Decimal,二进制码十进制数
在这种编码方式中,每一位二进制值的 1 都是代表一个固定数值,把每一位的 1 代表的十进制加起来,得到的结果就是它所代表的十进制数
二进制快速转十进制
比如,我们有一个二进制数 1111 1111,它的每一位对应的十进制数值是多少呢?
列举出来,就是 8421 码
可将二进制数值直接套入其中,0 对应的值不取,1 所对应的值取出并相加
二进制快速转八进制
八进制:将三个二进制位看为一组,再进行转换
原因:八进制逢八进一,三个二进制位最多可以表示 111,也就是数值 7,如果出现第四位,就超范围了
来看一个实例,将 0b111100 转换为八进制,我们将它拆分为 2 个三位二进制
再拼起来,就是 74
二进制快速转十六进制
十六进制:将四个二进制位看为一组,再进行转换
原因:十六进制逢十六进一,四个二进制位最多可以表示 1111,也就是数值 15,如果出现第五位,就超范围了
位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行计算
在二进制位运算中,1 表示 true,0 表示 false
符号 | 计算方式 |
---|---|
& | 有 0 则 0,全 1 才 1 |
| | 有 1 则 1,全 0 才 0 |
^ (位异或) | 相同为 false,不同为 true |
~ | 取反,二进制位全部取反,0 变 1,1 变 0,包括符号位 |
<< | 有符号左移运算,左边符号位丢弃,右边补齐 0 |
>> | 有符号右移运算,根据符号位,补齐左边 |
>>> | 无符号右移,无论符号位是 0 还是 1,都补 0 |
需要注意的是,参与位运算的是数的补码,补码是相对有符号数来说的,有符号数进行位运算的都是补码,正数的补码是它本身,只有负数的才不一样
对一个数左移 n 位,其实是将这个数乘以 2 的 n 次幂
对一个数右移 n 位,其实是将这个数除以 2 的 n 次幂
位运算的效率会比我们普通运算的效率高
一个数被另外一个数异或两次,该数本身不变
需求:已知两个整数变量 a = 10,b = 20,使用程序实现这两个变量的数据交换,最终输出 a = 20,b = 10
第三方变量方式思路:
public class demo {
public static void main(String[] args) {
int a = 10, b = 20;
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a + ",b = " + b);
}
}
异或运算方式思路:
public class demo {
public static void main(String[] args) {
int a = 10, b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a = " + a + ",b = " + b);
}
}
加减方式:
public class demo {
public static void main(String[] args) {
int a = 10, b = 20;
a = a + b;
b = a - b;
a = a - b;
System.out.println("a = " + a + ",b = " + b);
}
}