【新书推荐】3.2节 位运算之加减乘除

本节内容:二进制移位运算,以及逻辑运算与算术运算之间的转换。任何进制的位运算本质都是一样的。

         ■二进制数移位运算:二进制数向左移位运算相当于做2的幂乘法运算,二进制数向右移位运算,相当于做2的幂除法运算。

         ■十进制数移位运算:十进制移位运算与二进制数移位运算本质相同。

         ■移位运算的应用:移位运算实现乘法或除法运算。

         ■逻辑运算的应用举例:大小写字母的转换。

         ■二进制位运算与十进制加法运算之间的关系:二进制的加法运算与十进制加法运算本质相同,分为三个步骤实现:

  1. 二进制加法运算即xor异或运算。
  2. 判断是否有进位,and与运算。
  3. 如果有进位值,进位值左移1位,继续做进位值的加法运算,直到没有进位为止。
3.2.1 二进制数移位运算

    ■左移(进位):各二进位全部左移若干位,高位丢弃,低位补0。

举例

shl(<<)      1101 1000  左移2位为:0110 0000  。

0000 0001<<1==0000 0010         2   相当于1*21,结果为2。

0000 0001<<2==0000 0100         4   相当于1*22,结果为4。

0000 0001<<3==0000 1000              8   相当于1*23,结果为8。   

1111 1111=27 +26 +25+ 24 + 23 +22 +21 + 20 =128+64+32+16+8+4+2+1=255。

右移(借位):各二进位全部右移若干位,低位丢弃,高位补0或者补符号位。

举例

1.8位无符号整数右移。

shr(>>)      1101 1000  右移2位为:0011 0110。

15D     0000 1111>>1==0000 0111    7    移出0001   相当于15/2,商为7,余数1。

15D     0000 1111>>2==0000 0011    3    移出0011   相当于15/4,商为3,余数3。

15D     0000 1111>>3==0000 0001    1    移出0111   相当于15/8,商为1,余数7。

2.8位有符号整数4右移1位,即 4/2=2。

二进制数右移:0000 0100 右移1位,正整数高位补符号位0,结果为0000 0010B。

3.8位有符号整数-4右移1位,即 -4/2=-2。

第一步:计算-4的补码。

原码:1000 0100

反码:1111 1011

补码:1111 1100

第二步二进制数右移:1111 1100 右移1位,正整数高位补符号位1,结果为1111 1110B。

3.2.2 十进制数移位运算

    在上一章中我们强调过任何进制的算术逻辑运算本质上都是相同的。以此推论,二进制数移位运算和十进制数移位运算也应该是相同的。

举例

10进制数11左移2位,1100,空位补0,等于11*102。

10进制数11右移2位,0.11,空位补0,等于11/102 。

3.2.3 移位运算的应用

如果计算机没有乘法电路和除法电路时,可以用移位和加法运算来实现乘法和除法运算。在以后的代码示例和练习中,我们会经常使用移位运算来代替乘法或除法运算,特别是2的幂运算时,比较简单便捷。此处不再赘述。

3.2.4 逻辑运算的应用举例

举例

大写字母和小写字母的转换。如表3-3所示,在ASCII码表中大写字母和小写字母是有规律的,大写字母对应的ASCII值+20h,就是小写字母。我们也可以使用逻辑运算的方法进行大小写字母的转换。

大写A转换为小写a的算法:第5位置1,or运算。

小写a转换为大写A的算法:第5为置0,and运算。

             01000001          A

      or    00100000    

             01100001           a

                                                                 表3-3 ASCII码字母表

3.2.5  逻辑运算与加法运算之间的关系

例:十进制 168+934?

分为三个步骤:

第一步:加法运算;

第二步:进位运算;

第三步:进位结果左移1位,加进位值;

思考

思考:如果是十进制的计算机,可以通过位运算来实现加法运算吗?

例:  二进制1+7=?计算机怎么算(默认宽度为8位)

   0000  0001

   0000  0111 

   0000  1000

分为三个步骤:

第一步:异或运算,想当于十进制的加法运算;

第二步:与运算,相当于十进制的进位运算;

第三步:进位结果左移1位,加进位值;

计算机加法运算实现过程

图3-4 计算机加法运算过程

         如图3-4所示,计算机通过三个步骤实现加法运算。

第一步由异或逻辑电路实现加法运算;

第二步由逻辑与电路判断是否产生进位;

第三步如果有进位,将进位值1左移一位;

如此循环,直至不再有进位值为止。

计算机减法运算实现过程

         例:3-4=?(默认宽度为8位)→  3+(-4)

图3-5 计算机加法运算过程

如图3-5所示,计算机减法运算是加法运算的逆运算,同样可以通过逻辑异或、逻辑与和移位运算来实现。因此,早期的8086 CPU只有加法电路,但是同样可以实现减法、乘法和除法运算。

 

总结

二进制实现了逻辑运算和算术运算的统一。

计算机是通过逻辑电路实现算术逻辑运算和算术运算的。

练习

1、如何通过位运算判断一个数是奇数还是偶数?

2、如何读取二进制数中的某一位的值?

3、如何设置二进制数中的某一位的值?

4、2*8的移位法实现方式。

5、使用异或对 87AD6 进行加密后再进行解密,加解密密钥:5。

6、八进制数2-5 在计算器中的的结果是:1777777777777777777775   为什么?                                           

7、只用逻辑运算计算2-3=?(涉及内容:逻辑运算、移位、数据宽度)。

本文摘自编程达人系列教材《X86汇编语言基础教程》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL安全(一)权限系统

一、授权 1、创建用户 在MySQL中&#xff0c;管理员可以通过以下命令创建用户&#xff1a; namelocalhost IDENTIFIED BY password; name是要创建的用户名&#xff0c;localhost表示该用户只能从本地连接到MySQL&#xff0c;password是该用户的密码。如果要允许该用户从任何…

【深度优先搜索】【组合数学】【动态规划】1467.两个盒子中球的颜色数相同的概率

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及知识点 动态规划汇总 深度优先搜索 组合数学 LeetCode1467 两个盒子中球的颜色数相同的概率 桌面上有 2n 个颜色不完全相同的球&#xff0c;球上的颜色共有 k 种。给你一个大小为 k 的整数数组 balls …

启发式搜索(A*、IDDFS、IDA*)

我们在解决图问题的时候&#xff0c;通常需要使用DFS和BFS搜索&#xff0c;可是这两种搜索方式的效率较低&#xff0c;我们会遍历到很多空白节点&#xff0c;有没有办法可以优化这种低效问题呢&#xff1f;今天要推出我们的主角&#xff1a;启发式搜索。 一、A* 什么是A*算法…

MySQL索引原理以及SQL优化

案例 struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>; 熟悉C的同学知道&#xff0c;上述案例中&#xff0c;我们map底层是一颗红黑树&#xff0c;一个节点存储了一对kv&#xff08;键值对&#xff09;&…

go-zero 非k8s单体服务上线流程

1、安装mysql 镜像 docker pull mysql:5.7 2、创建mysql容器(主机目录要先存在 不然启动不起来。/opt/mysqlGo) docker run --name mysql-go -e MYSQL_ROOT_PASSWORD数据库密码 -p 8888:3306 -v /opt/mysqlGo:/var/lib/mysql -d 镜像id 3、可以通过navicat连接数据库&#…

【微服务】概述

微服务架构技术栈梳理 【注】本文旨在对微服务架构从整体上有一个简单的认识和了解&#xff0c;每一块都可能涉及较多的解决方案与实现框架&#xff0c;这里不做更深入的介绍。 1.背景&#xff08;Why&#xff09; 相关背景&#xff0c;也是推动单体服务走向微服务架构的原因…

seata 分布式

一、下载安装seata 已经下载好的朋友可以跳过这个步骤。这里下载的是seata1.6.1这个版本。 1、进入seata官网 地址&#xff1a; https://seata.io/zh-cn/index.html 2、进入下载 3、点击下载地址 下载地址&#xff1a; https://github.com/seata/seata 二、配置seata 进入c…

git仓库批量备份

git的mirror参数 在git中&#xff0c;--mirror是一个用于克隆和推送操作的参数。它用于创建一个镜像仓库&#xff0c;包含了源仓库的所有分支、标签和提交历史记录。 当使用git clone --mirror <source-repo>命令时&#xff0c;会创建一个完全相同的镜像仓库&#xff0…

虚拟机设置静态ip

有时候搭环境需要局域网&#xff0c;设置一下虚拟机静态ip&#xff0c;这里做个记录&#xff1a; 这里我用的是ubuntu18.04的虚拟机&#xff0c;安装完成之后&#xff0c;点击进入设置 这里设置一下桥接模式 这个时候输入ifconfig&#xff0c;就是和主机一个网段了&#xff…

Android 8.1 相关修改

一些常用修改&#xff0c;做个记录&#xff0c;为了节约时间和防止踩坑。 一、修改默认中文 修改位置&#xff1a; build\make\target\product\full_base.mk 修改内容&#xff1a; # Put en_US first in the list, so make it default. PRODUCT_LOCALES : zh_…

跟着cherno手搓游戏引擎【14】封装opengl

本节先把代码粘上&#xff0c;后续会慢慢把注释都给加上&#xff0c;先看代码了解个大概&#xff08;待更新&#xff09; 前置&#xff1a; RendererAPI.h: #pragma once namespace YOTO {enum class RendererAPI {None 0,OpenGL1};class Renderer {public:inline static R…

JavaWeb后端登录校验功能(JWT令牌技术,Cookie技术,Session,拦截技术,过滤器)

目录 一.登录校验功能&#xff08;解决直接通过路径访问&#xff09; 1.实现思路 二.会话技术 ​编辑 1.Cookie技术 2.Session 3.令牌技术 1.简介 2.如何生成和解析 3.令牌的使用 三.Filter过滤器 1.什么是过滤器 2.实现步骤&#xff1a; 3.过滤器执行流程 4.拦截路径 5.过…

[C++历练之路]C++中的继承小学问

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; C中&#xff0c;继承是一种面向对象编程的重要概念&#xff0c;它允许一个类&#xff08;子类/派生类&#xff09;从另一个类&#xff08;父类/基类&#xff09;继承属性和方法。继承是…

免费MySQL数据库客户端推荐

1. Navicat Lite Navicat Lite是一款功能强大的数据库管理工具&#xff0c;提供了免费版本供个人开发者使用。它支持MySQL等多种数据库系统&#xff0c;具有直观的用户界面和丰富的功能&#xff0c;包括数据编辑、导入导出、备份恢复等。 2. Toad Edge Toad Edge是一款针对开…

Hadoop-MapReduce-YarnChild启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-MRAppMaster启动篇>中已经将到&#xff1a;MRAppMaster的启动&#xff0c;那么运行M…

(刷题记录)移除元素

我的代码&#xff1a; class Solution {public int removeElement(int[] nums, int val) {int j0;for(int i0;i<nums.length;i){if(nums[i]!val){nums[j]nums[i];j;}}return j;} }思路&#xff1a;双指针&#xff0c;右指针指向当前要处理的元素&#xff0c;有不等的数就赋…

Docker私有仓库搭建

registry私有仓库 步骤一&#xff1a;先拉取registry的镜像 [rootlocalhost ~]#docker pull registry 步骤二&#xff1a;修改docker的配置文件重启 [rootlocalhost ~]#vim /etc/docker/daemon.json {"insecure-registries": ["192.168.66.66:5000"] }[r…

第二十天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

Leetcode 654.最大二叉树 题目链接&#xff1a;654 最大二叉树 题干&#xff1a;给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建: 创建一个根节点&#xff0c;其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大…

浅谈隔离放大器

浅谈隔离放大器 定义&#xff1a;隔离放大器是将输入的电量信号或物理量信号通过一种技术手段处理后,隔离输出一组模拟量信号,这组模拟量信号是以标准的4-20mA/0-20mA/0-10mA/0-10V/0-5V/1-5V/2-10V/0-2.5V/0-20mA/0-10mA/0-10V/0-100mV/0-5V等信号,以便控制系统及仪器仪表设备…

PGsql 解析json及json数组

创建测试数据 drop table if exists json_test; create table json_test as select 111 as id, {"nodes":{"1692328028076":{"nodeId":"1692328028076","nodeName":"测试表1","nodeType":"DATACO…