字——位级运算与有无符号数之间的比较
前言
本文整理和归纳《深入理解计算机系统》这本书的内容,但本文不会继续长篇大论地去将所有内容都总结,而是总结笔者认为容易遗忘或混淆或表述不清的内容。
字
首先字这个概念对于学习过《计算机体系结构》或《操作系统》的同学都不陌生,但是笔者对于这个概念很容易遗忘,所以笔者还是记录下来。
总的来说:字长决定了虚拟地址空间的最大大小。也就是说,对于一个字长为 w 位的机器而言,虚拟地址的范围为 0 ~ $2^w-1 $,程序最多访问 2 w 2^w 2w 个字节。
如果一台计算机的字长为32位,这就限定了虚拟地址空间为4GB。也就是说,即使你的主存容量再大,处理器也只能寻址4G的范围,同样的道理,在嵌入式中,8位机的概念就是字长为8位的微型处理器。
现在市面上有许多32位,64位机器,在不同机器之间程序会遇到数据长度,寻址能力等方面的挑战,一个强大的程序,应该兼容不同的机器。
数据大小
可以看到,在C语言中,数据类型在不同的字长的机器上占有不同的字节数,程序员应该力图使它们的程序在不同的机器和编译器上是可移植的,可移植性的一个方面就是程序堆不同数据类型的确切大小不敏感。
布尔代数
布尔代数实际上就是围绕数字0与1建立起来的一种代数体系,以研究逻辑推理和基本原则。
布尔代数只有0和1两个数,拥有与(&)、或(|)、非(~)、异或(^) 等运算,且运算间也遵循某种分配律和交换律
位级运算
在这里我们值得一提的是:在异或(^)运算中,我们需要注意到:a^a=0
以及a^b^a=b
正是由于异或拥有这种神奇的性质,我们可以完成以下脑经急转弯。
请设计一个程序,在不适用第三个变量的情况下,交换x与y的值
void inplace_swap(int *x, int *y) {*y = *x ^ *y; // step1*x = *x ^ *y; // step2*y = *x ^ *y; // step3 }
从上面这个函数可以看出,在step1时,y现在存储的值时 x ^ y
,在step2时,x 的值变为 x^ x ^ y = y
这是根据a^b^a=b
的运算规则,step3同学们可以自己算一下。
a^b^a=b
这是一个运算规则而非定理,即,这并非人为规定,而是客观规律。我们尝试以下运算
a = 0110 0101
b = 1100 1011
根据异或的运算规则,相同则为0,不同则为1
我们设c = a ^ b = 1010 1110
此时再用c ^ a 得到
d = c ^ a = 1100 1011
你会发现,d = b ,即 a ^ b ^ a = b
除此之外,还有一个例题非常有意思
bis(位设置):输入一个数据字x和一个掩码字m,生成一个结果z,z是由掩码m的位来修改x得到的,这种修改是在m为1的每个位置上,将z对应的位置设为1
bic(位清除):输入一个数据字x和一个掩码字m,生成一个结果z,z是由掩码m的位来修改x得到的,这种修改是在m为1的每个位置上,将z对应的位置设为0
为了清楚因为这些运算与 C 语言位级运算的关系,假设我们有两个函数 bis 和 bic 来实现位设置和位清除操作。只想用这两个函数,而不使用任何其他 C 语言运算,来实现按位 | 和 ^ 运算。填写下列代码中缺失的代码。提示 :写出 bis 和 bic 运算的 C 语言表达式。
// 你可以使用的函数 int bis(int x, int m); int bic(int x. int m); // 完善下列函数 int bool_or(int x,int y){int result = _______;return result; } int bool_xor(int x, int y){int result = _______;return result; }
我们可以根据说明,模拟一下bis函数的运行输入输出:
当x = 0110 0101 m = 1100 1011时,
根据bis的说明,m的某一位为1时,则x对应的位被修改为1,其它不变
那么,res = bis(x,y) 则 res = 1110 1111
根据bic的说明,m的某一位为1时,则x对应的位被修改为0,其它不变
那么, res = bic(x,y) 则 res = 0010 0100
那么, res = bic(y,x) 则 res = 1000 1010
根据上面的演算,我们可以发现,当你使用bis时,则x与m两者都是0的位才为0,否则即为1。当你使用bic时,则仅有m为0时且x为1时,才为1。
那么或运算就好办了,因为或运算的规则就是只要有1则为1,逆命题就是两者为0才为0,即bis运算
则第一个函数为:
int bool_or(int x,int y){int result = bis(x,y);return result;
}
异或运算的规则为,只要不同则为1,否则为0。根据bic运算,当你使用bic时,则仅有m为0时且x为1时,才为1,可以得到不同的其中一种情况,即m为0且x为1,还要第二种情况,m为1且x为0,那么只需要将m与x的位置调换,在运算以此即可获得,然后将两者进行或预算,也就是bis运算即可。
int bool_xor(int x, int y){int result = bis(bic(x,y),bic(y,x));return result;
}
掩码
在数据处理中的掩码与计算机网络中的掩码概念有所不同,在这里的掩码你可以理解为是一种滤波器,它可以将特定位的数据通过而屏蔽掉其它位的数据,如
掩码:0x0000FF 与 a : 0x123456 进行运算,则会得到
res = 0x000056
补码编码
跳过了无符号数的编码
在计算机中,有符号数的表示方式就是补码,将字中最高有效位定义为负权(negative weight),如
1011 = -1* 2 3 2^3 23+0* 2 2 2^2 22+1* 2 1 2^1 21+1* 2 0 2^0 20 = -8 + 0 + 2 + 1 = -5
在这种编码下,最高位变成了乘了一个-1
,因此,在这种情况下,我们要考虑在有有符号数补码编码的情况下的几种特殊情况:
0000 = 0
1111 = -1
0001 = 1
1000 = -8
0111 = 7
在字长未4的情况下,有符号数的补码编码中,取值范围为[-8:7],1111并非最小值,而是-1,1000才是最小值为-8,0111是最大值7
在0000,0001,0010,…,0111,1000,…,1111以此类推中,实际上的数值变化是,0,1,2,…,7,-8,-7,…,-1
由此我们可以看到,补码的范围是不对成的,即最小值没有与之对应的正数。这导致补码运算的某些特殊的属性,并且容易造成程序中细微的错误。
以下表格中,* U M a x w UMax_w UMaxw表示无符号数的最大值, T M i n w TMin_w TMinw表示有符号数的最小值, T M a x w TMax_w TMaxw*表示有符号数的最大值
数据比较
由于 C 语言对同时包含有符号和无符号数表达式的这种处理方式,出现了一些奇特的行为。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么 C 语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。就像我们将要看到的,这种方法对于标准的算术运算来说并无多大差异,但是对于像 < 和 > 这样的关系运算符来说,它会导致非直观的结果。考虑比较式 -1<0U。因为第二个运算数是无符号的,第一个运算数就会被隐式地转换为无符号数,因此表达式就等价于4294967295U<0U,这个答案显然是错的。
相关文章:
字——位级运算与有无符号数之间的比较
前言 本文整理和归纳《深入理解计算机系统》这本书的内容,但本文不会继续长篇大论地去将所有内容都总结,而是总结笔者认为容易遗忘或混淆或表述不清的内容。 字 首先字这个概念对于学习过《计算机体系结构》或《操作系统》的同学都不陌生,…...
Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例
本文介绍了7个Python爬虫小案例,包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息,帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等!【…...
‘Optional. get()‘ without ‘isPresent()‘ check
在Java中,Optional类被引入主要是为了解决NullPointerException的问题,它提供了一种更优雅的方式来处理可能为null的情况。Optional.get()方法用于获取Optional实例中包含的值,但如果Optional实例是空的(即没有值)&…...
015-spring-动态原理、AOP的xml和注解方式
强制使用cglib动态代理 spring-AOP的使用...
统计颜色Count Color(POJ2777)题解
有一个长度为L厘米板,L是一个正整数,所以我们可以把它均匀地划分成L个部分,分别从左到右编号为1,2……L,每一个部分长度都为1厘米。现在我们必须给每个部分涂色,一个部分一种颜色,要求完成以下两…...
Nginx 配置 SSL(HTTPS)详解
Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。 随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…...
Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项
栈和队列理论基础 抽象认识 栈是先进后出(FIFO),队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框,取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...
pytorch基础之注解的使用--003
Title 1.学习目标2.定义3.使用步骤4.结果 1.学习目标 针对源码中出现一些注解的问题,这里专门写一篇文章进行讲解。包括如何自定义注解,以及注意事项,相信JAVA中很多朋友业写过,但是今天写的是Python哦。。。 2.定义 在 Python…...
2024-12-30-g++
title: 探秘 g:C 编程的得力编译器 date: ‘2024-12-30’ category: blog tags: gC 编程编译器技术代码生成与优化 sig: compiler archives: ‘2024-12’ author:way_back summary: g 作为专门用于 C 语言的编译器,在 C 开发领域占据关键地位。它凭借对…...
互联网十万个为什么之什么是微服务
微服务(Microservices)是一种软件架构设计模式,它将应用程序分解为小型、自治的服务单元,这些服务单元可以独立部署、扩展和维护,其中每一个服务单元也都是一个微服务。 基于微服务形成的软件架构风格称为微服务架构&…...
mysql子查询
子查询是嵌套在另一个 SELECT, INSERT, UPDATE, 或 DELETE查询的 SQL 查询。子查询可以在 WHERE 子句中、FROM 子句或 SELECT 列表中出现。 以下是一些使用 MySQL 子查询的常见示例: 1.在 WHERE 子句中使用子查询: SELECT * FROM Employees WHERE s…...
智能故障诊断和寿命预测期刊推荐
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…...
根据语言变化动态更新图片资源方案
根据语言变化动态更新图片资源方案 一、需求描述二、关于 Locale三、实现方案3.1 方案一(不可行)3.2 方案二(不可行)3.3 方案三 一、需求描述 Android 项目中引导页图片包含文字信息,由于应用是适配了三种语言&#x…...
Python世界:数据结构易错点小结
Python世界:数据结构易错点小结 总体list列表tuple元组Stringdict字典mapset 部分笔记汇总,持续刷新中。区别于其他笔记之处在于,主要记录易错点坑点。 总体 数据结构声明辨析 list []tuple () const listditc {} hashset res set(list) 数…...
Linux | Ubuntu零基础安装 nvm 管理nodejs
目录 介绍 项目地址 前置工具 安装 查看环境配置 更新环境变量 查看版本 查看 nodejs包 列表 安装nodejs 查看 nvm 状态 测试 nodejs 介绍 nvm是什么?你可以把它理解成 nodejs的管理软件,方便快速切换nodejs的版本,达到兼容状态 …...
flask后端开发(3):html模板渲染
目录 渲染模板html模板获取路由参数 gitcode地址: https://gitcode.com/qq_43920838/flask_project.git 渲染模板 这样就能够通过html文件来渲染前端,而不是通过return了 html模板获取路由参数...
HAL 库句柄
一、命名方式:句柄是h为首字母,后面接协议名称 比如:huart、hadc、hi2c等 二、句柄类型: 这里拿huart举例,它的类型是UART_HandleTypeDef 进去stm32f1xx_hal_uart.h之后发现句柄的结构定义有部分是灰色的 灰色的当U…...
53.最大子数组和
53.最大子数组和 思路:动态规划 dp[i]表示截止到i的最大连续子数组的和 dp[0]nums[0] dp[i]max(dp[i-1]nums[i],nums[i]) 代码: class Solution { public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums.size());dp[0]…...
计算机网络 (16)数字链路层的几个共同问题
一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部,构成了一个帧。接收端在收到物理层上交的比特流后…...
[OpenGL]使用glsl实现smallpt
一、简介 本文介绍了如何使用 OpenGL,使用 glsl 语言在 Fragment shader 中实现 smallpt。程序完成后可以得到以下渲染结果(samples per pixel, spp 16)。在程序中按下A,W可以左右平移,按下W,S可以前后平移: 二、s…...
数据结构与算法Python版 骑士周游问题与深度优先搜索
文章目录 一、图的应用-骑士周游问题二、图的深度优先搜索 一、图的应用-骑士周游问题 骑士周游问题 在一个88的国际象棋棋盘上,一个棋子“马”(骑士),按照“马走日”的规则,从一个格子出发,要走遍所有棋…...
HIVE数据仓库分层
1:为什么要分层 大多数情况下,我们完成的数据体系却是依赖复杂、层级混乱的。在不知不觉的情况下,我们可能会做出一套表依赖结构混乱,甚至出现循环依赖的数据体系。 我们需要一套行之有效的数据组织和管理方法来让我们的数据体系…...
WOFOST作物模型(3):敏感性分析
目录 一、定义参数范围二、采样生成参数样本三、运行不同参数组下的WOFOST四、计算敏感度与可视化1.敏感度2.二阶交互敏感度五、敏感变量对产量的影响结果可视化一、定义参数范围 使用TAGP(Total Above Ground Production),地上总产量 TSUM1,temperature sum from emergence…...
【2024年-6月-14日-开源社区openEuler实践记录】探索 test - tools:高效测试的开源宝库
开篇引言 大家好,我是 fzr123,在软件开发领域深耕多年,一直致力于探索各种提升效率的工具与技术。今天,我将为大家深入介绍一款在测试领域极具价值的开源项目——test - tools,它为开发者们提供了一系列强大的测试功能…...
go-xorm连接
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm" )func MysqlDbContent() {//数据库基本信息var (userName string "root"password string "12345678"ipAddress string &…...
Java字节分割文件流
使用 Java 通过字节分割大文件并将其以文件流的方式读写的示例代码。这个代码展示了如何将一个大文件分割成多个小文件,并以字节流的方式操作文件。 完整代码示例 import java.io.*;public class FileSplitter {public static void main(String[] args) {// 原始文…...
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
目录 一、toString() 方法是啥? (一)默认的 toString() 方法 (二)toString() 方法的作用 二、为啥要重写 toString() 方法? (一)提高代码的可读性 (二)…...
仙盟系统开发——启动app失败
var 返回 仙盟使者.Cyber_CallApp(VOAPP, 命令, 携带);...
使用ArcGIS Pro自带的Notebook计算多个遥感指数
在之前的分享中,我们介绍了如何使用ArcPy将GEE下载的遥感影像转为单波段文件。基于前面创建的单波段文件,我们可以一次性计算多种遥感指数,例如NDVI、EVI、NDSI等。我这里直接在ArcGIS Pro中自带的Notebook进行的运行。如下图所示,…...
深入Android架构(从线程到AIDL)_认识进程(Process)与IPC架构02
3、 设定IPC通信 -- 使用AndroidManifest.xml文件 在Android框架里,一个应用(程序)套件(Application Package)通常含有多个Java类(Class),这些类可以在同一个进程(Process)里执行;也可以在不同的进程里执行 。通常,一个进程…...
在K8S中,节点状态哪个组件负责上报?
在Kubernetes中,节点状态是kubelet组件负责定期上报的。Kubelet是运行在每个节点上的代理程序,它与Kubernetes Master节点上的控制面板组件紧密协作,以确保节点上的Pod能够正确运行。 kubelet的主要职责之一就是:与Kubernetes API…...
AI 神经网络在智能家居场景中的应用
在科技持续进步的当下,智能家居领域正经历着深刻变革,AI 神经网络技术的融入成为推动这一变革的关键力量,为家居生活带来了诸多显著变化与提升,本文将几种常见的AI算法应用做了一下总结,希望对物联网从业者有所帮助。 …...
C++基础:SGI STL二级空间配置器内存池
2024/12/14-2024/12/ : 这篇稍微写一下阅读SGI STL内存池的收获。 reference: [1] 深度剖析SGI STL二级空间配置器内存池源码 [2] C内存管理:new / delete 和 cookie [3] 侯捷 内存管理 文章目录 一、写在前面二、二级空间配置器解读2.1 从 malloc 和 fr…...
Python简介
Python 是一种高级编程语言,以其简洁易读的语法和强大的功能而广受欢迎。以下是对 Python 的详细简介: python官网:https://www.python.org/ python中文官网:Python中文网 官网 历史与起源: Python 由荷兰人 Guido…...
Linux之ARM(MX6U)裸机篇----7.蜂鸣器实验
一,蜂鸣器模块 封装步骤: ①初始化SNVS_TAMPER这IO复用为GPIO ②设置SNVS_TAMPPER这个IO的电气属性 ③初始化GPIO ④控制GPIO输出高低电平 bsp_beep.c: #include "bsp_beep.h" #include "cc.h"/* BEEP初始化 */ void beep_init…...
手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中,我们论述了局域网SIP坐席通过手机外呼出去时,手机中主副卡的呼叫调度策略。 但…...
GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网
记录一些平时接触到的 GPU 知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用 1 术语与基础 1.1 PCIe 交换芯片1.2 NVLink 定义演进:1/2/3/4 代监控1.3 NVSwitch1.4 NVLink Switch1.5 HBM (High Bandwidth Memory) 由…...
Unresolved plugin: ‘org.apache.maven.plugins:maven-site-plugin:3.12.1‘
问题 使用idea 社区办加载项目提示下面问题: Unresolved plugin: org.apache.maven.plugins:maven-site-plugin:3.12.1 问题解决 maven插件地址: https://maven.apache.org/plugins/maven-dependency-plugin/plugins.html Maven 中央仓库地址&#…...
GO性能优化的一些记录:trace工具的使用
使用场景: 1 想要查看接口延时性偏高 2 深入了解协程具体如何运营的详细信息(运行时长,或者什么原因导致了协程运行受阻) 可以使用 trace 功能,程序便会对下面的一系列事件进行详细记录,并且会依据所搜集到…...
springboot maven 构建 建议使用 --release 21 而不是 -source 21 -target 21,因为它会自动设置系统模块的位置
使用 --release 选项代替 -source 和 -target 是一种更安全、更兼容的方式,特别是在构建使用较新版本 JDK 的项目时。以下是详细解释和建议: 1. 为什么推荐使用 --release 问题点: 使用 -source 和 -target 标志时,仅设置了代码的语言级别和字节码目标版本,但编译器仍可…...
设计模式-创建型-单例模式
1. 单例模式简介 单例模式(Singleton Pattern)是一种常见的创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。在很多情况下,我们只希望某个类在整个应用程序中有一个唯一的实例,且该实例需要在…...
linux 网卡配置
linux网卡可以通过命令和配置文件配置,如果是桌面环境还可以通过图形化界面配置. 1.ifconfig(interfaces config)命令方式 通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来…...
python文件操作相关(excel)
python文件操作相关(excel) 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...
利用Abel_Cain软件实现ARP欺骗
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主…...
搭建android开发环境 android studio
1、环境介绍 在进行安卓开发时,需要掌握java,需要安卓SDK,需要一款编辑器,还需要软件的测试环境(真机或虚拟机)。 早起开发安卓app,使用的是eclipse加安卓SDK,需要自行搭建。 目前开…...
使用 Python -m build打包 Python 项目:详解过程与细节
使用 Python -m build 打包 Python 项目:详解过程与细节 Python 项目的打包是发布和分发软件的核心环节。本文将基于用户提供的 pyproject.toml 文件和项目目录结构,详细说明 Python -m build 命令的执行过程,并解答 是否会将 oe_eval 中的代…...
019-spring-基于aop的事务控制原理
1、事务配置: <tx:annotation-driven transaction-manager"transactionManager"/> transaction-manager 默认是找这个bean:transactionManager 2、从命名空间开始找到对应的解析配置如下: 对应的是这个 后续跟源码没有搞明…...
210.xxl-job定时任务:架构,可视化,GLUE模式,负载均衡,分片
目录 一、为什么要用xxl-job 二、xxl-job架构 三、启动调度中心 1.初始化数据库 2.编译源码 四、启动执行器 五、GLUE模式运行 六、负载均衡 七、分片 1.分片环境准备 2.分片实现 八、感谢支持 一、为什么要用xxl-job 以前我们用quartz实现定时任务,但是那是单机…...
LVS 负载均衡原理 | 配置示例
注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时,可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写,翻…...
堆内存易碎片化
堆内存容易碎片化主要是由于其内存分配和释放的特性以及管理方式的复杂性所导致的。以下是对堆内存容易碎片化的详细解释: 一、内存分配和释放的非连续性 堆内存的分配和释放并不是连续的,这意味着在多次分配和释放后,原本连续的内存空间可…...