计算机组成学习(CSAPP)
前言
按照 CSAPP 学习。由于本人具备了一定的基础,所以写的不会很详细。
Integers
二进制,没有什么好说的。long double 在 x86-64是 10 或者 16 位。
乘法需要三个周期,而加法只需要一个,除法需要30+。
210≈1032^{10} \approx 10^3210≈103 以此类推,可以快速确定一个数字的位数。
uint 与 int 比较的时候,是 int 转 uint 所以 uint<=-1
Big Endian 与 Little Endian
例如表示 0x01234567 前者是01 23 45 67 后者是67 45 23 01 有的机器是前者方式,有些机器是后者方式。但在2024年,你很难买到前者了,换句话说都是倒过来的,即Little Endian
Floating Point
对于一个数字,二进制下表示先转化为 1.xxxxxxxxx∗2exp1.xxxxxxxxx*2^{exp}1.xxxxxxxxx∗2exp
下文中,阶码表示为exp,尾数表示为 frac
类型
长度
符号位
exponent(阶码)
fraction( ...
杂项(其一)
为什么计算机要使用补码
首先,考虑进制问题,更高的进制有更多的电位,采用二进制问题最少。
其次,必须有符号位,在日常中,符号位通常是第一位,不妨将其放在最高位,例如以下 4bit 的计算机中:
如果用 1xxx 表示正数,0xxx表示负数,显而易见,0会出现两次,即1000与 0000 ,这里浪费了一个数字。
不妨设 0xxx 的xxx在十进制表示下为 t ,将 0xxx 视为 t-1 ,例如0000=-1
这里已经初步解决问题了,然而计算机不能较好解决减法,通常的做法是把他加到溢出,例如最大为 15 ,要想计算 8-2 就得计算 (8+(16-2)) MOD 16 = 6,这里 16-2 其实是取反操作。(其实这里是5bit)
到这一步,理论上来说已经解决了问题了,可为什么计算机用的是补码而不是这样的编码方式呢?
首先,负数的处理及其麻烦,考虑 a+b ,如果a 是负数的话,先要把a转化成正数,然后再取反(符号位不取反),例如 -2+5=0001+1101=0110+1101=(符号位)+1011(->011),还需要通过比较大小确定符号位。
考虑到刚刚利用到的那一个进位,这里 ...
ModernCPP学习记
底层const与顶层const
顶层const指的是被修饰变量本身无法改变,底层const指的是通过限制指针或者限制引用更改内容的const
通过以下代码来说明
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061void test1(){ int n = 1; int m = 2; int *const p1 = &n; const int * p2 = &n; // 第一个const 仅修饰p1 // p1指向的n可以被修改,但是p1自身不能被修改 (*p1)+=2; std::cout<<n<<'\n'; // p1=&m; // p2自身可以被修改,但是(*p2)不能被修改 // (*p2)++; p2=&m; // 这不代表p2指向的东西不能被 ...
CodeforcesRound916_div3_题解
题目列表
CF1914
A. Problemsolving Log
B. Preparing for the Contest
C. Quests
D. Three Activities
E. Game with Marbles
F. Programming Competition
G. Light Bulbs
AB 一句话题解
A.用一个桶记录数字出现次数然后从小到大枚举即可
代码
B.题目给你 n,k 你要保证生成一个序列 {a} 满足 ai>ai−1a_i>a_i-1ai>ai−1 不得超过 k 次(从第二位开始计数)
代码
C
C.n个关卡,首通奖励 a_i 重复通关奖励 b_i ,你最多能打x关并且通关按照顺序,询问你最多能够得到多少奖励
我们可以枚举通到哪一关,重复通关就直接一直通之前 b_i 最大的即可
代码
D
给你三个数组 a,b,c 选择最大的 ai+bj+ck,i≠j≠ka_i+b_j+c_k , i\neq j\neq kai+bj+ck,i=j=k
直接a,b,c排序取前3个最大的,可以证明取前三个最大的一定包含最优情况。
代码
...
2023ICPC杭州游记
见本人知乎回答
见本人知乎回答
www
wordle猜单词
项目地址
这里
Educational Codeforces Round 156
D. Monocarp and the Set
题目大意,给你一个表示排列元素的序列,包括 <?> , 其中 < 表示在之前是最小的 > 表示在之前是最大的,否则就是 ? ,有 mmm 次操作 ,每次可能修改下标的值,你这个表示序列的序列最多能表示多少种排列。
先不考虑修改,对于最初始的序列,第一个绝对不能是问号,然后从后往前看,如果不是问号就只能填一种东西,是问号可以填 x−2x-2x−2 (假设当前下标为 xxx ) 个数。以此可以统计答案。
修改也同理。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include<bits/stdc++.h>#define int long longusing namespace std;const int maxn=300300;const int modp=998244353;int n, ...
物理机linux下安装 stable-diffusion 踩坑记录
前言
心血来潮,买了一张 3080 20G ,遂安装ubnutu。
以下东西不保证完整,想到啥写啥。
踩坑(过程)统计
*
软件安装类问题
*
显卡驱动安装
*
网络问题
*
stable diffusion相关
*
稀奇古怪的问题
软件安装类问题
这部分踩坑如下:
安装慢
很显然是要换源。
sudo vi /etc/apt/sources.list
在里面设置
1234deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubu ...
2023暑期牛客多校-6
过题数
排名
A
B
C
D
E
F
G
H
I
J
4
258
B
√
√
√
√
123456|过题数|排名|A|B|C|D|E|F|G|H|I|J|K|L|M||-----|----|-|-|-|-|-|-|-|-|-|-|-|-|-|| | | | | | | | | | | | | | | |√ 赛时过了B 补题过了
A Tree
题目要求你改变一些点的黑白(可以不改变),按照颜色分为两个集合后,你需要最大化 ∑x∈V1∑y∈V2val(x,y)\sum_{x\in V_1}\limits \sum_{y \in V_2} \limits val(x,y)x∈V1∑y∈V2∑val(x,y) 最小, val(x,y)val(x,y)val(x,y) 表示两点之间路径中最大的边的边权。
这种题应该一开始就想到重构树,这样一条边的贡献就转化为了父节点到子节点之间,然后我们简单跑一个树形背包就可以了。
1234567891011121314151617181920212223242526272829303132333435363 ...
从OIer到ACMer-cpp重新学习
auto&decltype
auto name=value
自动补全 name 的类型。
decltype(value2) name=value1
将 value2 的类型赋予 name
小尝试:
123456789101112#include<bits/stdc++.h>using namespace std;const int x=1;int main(){ decltype(x) a = 1; a++; cout<<typeid(a).name()<<endl;}
代码报错,可见赋值结果是 const int
但是auto把一个变量赋值为一个常量的值是可以的
1234567891011121314#include<bits/stdc++.h>using namespace std;const int x=1;int main(){ // decltype(x) a = 1; // a++; auto a=x; a++; cout<<ty ...