进制和位运算

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:计算机组成原理
🌠 首发时间:2022年9月11日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🌟 一以贯之的努力 不得懈怠的人生

进制

简介

进制指进位制,是人们规定的一种进位方式

它表示某一位置上的数,运算时是逢 X 进一位。比如,十进制是逢十进一,二进制就是逢二进一,八进制就是逢八进一…

学习进制的理由

计算机数据在底层运算的时候,都是以二进制的形式进行的

也有数据是以八进制、十进制或者十六进制进行存储或运算,了解不同的进制,便于我们对数据的运算过程理解得更加深刻

我们都知道 ASCII 码,也知道 aASCII 码是 97,但是你知道它为什么是 97 吗?

十进制

运算规则:逢十进一,借一当十

十进制是我们很熟悉的进制了,毕竟我们从幼儿园就开始学习了,它的运算规则也很好理解了,其他进制的运算规则和十进制的大同小异

二进制

二进制数据就是用 01 两个数码来表示,例如:0000 0110

进位规则是“逢二进一”,借位规则是 “借一当二”

二进制的计算举例

加法:0011 + 1 = 0100
减法:0010 - 1 = 0001

很简单,是不是

八进制和十六进制

八进制:采用 0,1,2,3,4,5,6,7 这八个数字来表示,逢八进一,借一当八

十六进制:用数字 09 和 字母 AF(或 a ~ f)来表示,其中 A ~ F 表示 10 ~ 15,这些称作十六进制

不同进制的书写格式

  • 十进制:一般,数值默认都是 10 进制,不需要加任何修饰
  • 二进制:数值前面以 0b 开头,b 大小写都可以
  • 八进制:数值前面以 0 开头
  • 十六进制:数值前面以 0x 开头,x 大小写都可以

我们在 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);   //十六进制
    }
}

打印出来的结果如下:

在这里插入图片描述

进制转换

二进制转十进制

公式:系数 * 基数的权次幂,然后相加

  • 系数:每一位上的数
  • 基数:几进制,就是几
  • 权:从数值的右侧,以 0 开始,逐个 +1 增加

这样说可能不是特别直观,我们来看一个具体的例子,比如 0b100,这个数的十进制是多少呢?

首先,0b 表示这个数为二进制形式

系数 * 基数的权次幂如下:
第一位:0 * 20 = 0
第二位:0 * 21 = 0
第三位:1 * 22 = 4

然后相加,0 + 0 + 4 = 4,结果就是 4 了

注意:上面的公式同样适用于八进制转十进制、十六进制转十进制

十进制转二进制

公式:除基倒取余

解释:使用源数据,不断地除以基数(几进制,就是几)得到余数,直到商为 0,再将余数倒着拼起来即可

比如,将十进制数字 11,转换为二进制,它的实现方式如下

将源数据 11 不断地除以基数 2,直到商为 0,结果为 1011

在这里插入图片描述

注意:上面的公式同样适用于十进制转八进制、十进制转十六进制

快速进制转换法

8421码 —— 二进制和十进制的快速转换

8421 码又称为 BCD 码,是 BCD 代码中最常用的一种

BCDBinary-Coded Decimal,二进制码十进制数

在这种编码方式中,每一位二进制值的 1 都是代表一个固定数值,把每一位的 1 代表的十进制加起来,得到的结果就是它所代表的十进制数

二进制快速转十进制

比如,我们有一个二进制数 1111 1111,它的每一位对应的十进制数值是多少呢?

列举出来,就是 8421

在这里插入图片描述

可将二进制数值直接套入其中,0 对应的值不取,1 所对应的值取出并相加

二进制快速转八进制

八进制:将三个二进制位看为一组,再进行转换

原因:八进制逢八进一,三个二进制位最多可以表示 111,也就是数值 7,如果出现第四位,就超范围了

来看一个实例,将 0b111100 转换为八进制,我们将它拆分为 2 个三位二进制

在这里插入图片描述

再拼起来,就是 74

二进制快速转十六进制

十六进制:将四个二进制位看为一组,再进行转换

原因:十六进制逢十六进一,四个二进制位最多可以表示 1111,也就是数值 15,如果出现第五位,就超范围了

位运算

位运算符

位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行计算

在二进制位运算中,1 表示 true0 表示 false

符号计算方式
&有 0 则 0,全 1 才 1
|有 1 则 1,全 0 才 0
^ (位异或)相同为 false,不同为 true
~取反,二进制位全部取反,0 变 1,1 变 0,包括符号位
<<有符号左移运算,左边符号位丢弃,右边补齐 0
>>有符号右移运算,根据符号位,补齐左边
>>>无符号右移,无论符号位是 0 还是 1,都补 0

需要注意的是,参与位运算的是数的补码,补码是相对有符号数来说的,有符号数进行位运算的都是补码,正数的补码是它本身,只有负数的才不一样

对一个数左移 n 位,其实是将这个数乘以 2n 次幂

对一个数右移 n 位,其实是将这个数除以 2n 次幂

位运算的效率会比我们普通运算的效率高

异或运算的特点

一个数被另外一个数异或两次,该数本身不变

数据交换

需求:已知两个整数变量 a = 10,b = 20,使用程序实现这两个变量的数据交换,最终输出 a = 20,b = 10

第三方变量方式思路:

  1. 定义一个临时变量 temp,将 a 原本记录的值交给 temp 记录
  2. 使用 a 变量记录 b 的值
  3. 使用 b 变量记录 temp 的值,也就是 a 原本的值
  4. 输出 a b 变量即可
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);
    }
}

异或运算方式思路:

  • a 先异或 b 再异或 a,这就相当于是 b 异或了 a 两次,于是 a 的值就变成了 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);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序喵正在路上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值