• 进制和位运算


    🔥 本文由 程序喵正在路上 原创,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);   //十六进制
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    打印出来的结果如下:

    在这里插入图片描述

    进制转换

    二进制转十进制

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

    • 系数:每一位上的数
    • 基数:几进制,就是几
    • 权:从数值的右侧,以 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    异或运算方式思路:

    • 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    加减方式:

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    相机光学(三十七)——自动对焦原理
    客服常用100句用语帮您全面搞定客服回复
    如何冻结模型,避免 model.train() 改变模型部分模块
    Astro建站教程:安装nodejs,npm下载Astro,安装扩展
    web前端-html-css-字体(字体的样式,字体的分类,字体其他样式,字体简写样式,文本样式)
    centos7安装mysql-阿里云服务器
    Jenkins构建Maven项目
    [数据结构] 图---图的邻接矩阵存储方式模拟实现,包括BFS广度优先遍历和DFS深度优先遍历(上)
    .NET6接入Skywalking链路追踪完整流程
    wx:for-item wx:for-index wx:for-key
  • 原文地址:https://blog.csdn.net/weixin_62511863/article/details/126803248