CSAPP学习笔记
程序员文章站
2022-06-29 18:53:58
...
20/100发布文章 博文管理我的博客退出 Trash Temp 欢迎使用CSDN-markdown编辑器 添加摘要 20/100发布文章 博文管理我的博客退出 Trash Temp 欢迎使用CSDN-markdown编辑器 添加摘要 20/100发布文章 博文管理我的博客退出 Trash Temp 欢迎使用CSDN-markdown编辑器 添加摘要 CSAPP学习笔记---------cmu实验data-lab
1.异或:
- bitXor - x^y using only ~ and &
- Legal ops: ~ & //限制操作符
- Max ops: 14 //最多代码数
int bitXor(int x, int y) {
int val1 = (~x)&y;
int val2 = (~y)&x;
return ~((~val1)&(~val2));
}
思路的关键在于将两数x,y各自机器级01序列中同一位置上不同的地方记录下来
分为4种情况:
y | … | 1 | … | 1 | … | 0 | … | 0 |
---|---|---|---|---|---|---|---|---|
x | … | 1 | … | 0 | … | 1 | … | 0 |
首先将表中第2,3列分别以1的方式记录下来即代码第一二行
但是由于不能直接使用加法和位级或运算,所以,这是只需要将上一操作得到的两个01序列各位取反(~)再相与,最后再做一次取反即可
2.判断奇数位是否均为1:
- allOddBits - return 1 if all odd-numbered bits in word set to 1 //是则返回1,不是则返回0
- Legal ops: ! ~ & ^ | + << >> //合法运算符
- Max ops: 12 //操作限制
int allOddBits(int x) {
int val1=3*x+1;
return !x;
}
0 | 1 | 0 | 1 | … | 0 | 1 | 0 | 1 |
---|
显然,只需满足1个条件即可:2x+x得到的是一个全1序列(直接x*3即可)
如果满足要求条件则第一步就得到了一个全1序列,再将之加上1则为全0序列(即值为0)
再进行非运算(!)就得到了1
如果不满足则第一步就得不到全1序列,加上1也就不会是全0序列,再通过!运算返回0
这里还有另一种方法:将2x进行~运算,再与x异或,将最终得到的结果进行非运算(!)返回:
int allOddBits(int x) {
int val1=(2*x)^x;
return !val2;
}
``
3.判断是否为ASCII码值
- isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters ‘0’ to ‘9’)
- Legal ops: ! ~ & ^ | + << >> //合法运算符
- Max ops: 15 //操作次数限制
int isAsciiDigit(int x) {
int val1 = x+6;//上限
int val2 = !(val1>>6);//val2的值为1表示小于0x39,为0表示大于0x39或者为负数
int val3 = (x-16)>>5;//如果x小于0x30,那么x-16从低有效位开始的第6为必定为0
int val4 = 1&val3;
int val5 = val2&val4;
}
4.条件返回:
- conditional - same as x ? y : z
- Legal ops: ! ~ & ^ | + << >> //合法操作符
- Max ops: 16 //操作限制
int conditional(int x, int y, int z) {
int val1 = ~(y&(~z));//将Y为1而Z为0的地方以0的方式记录下来
int val2 = (~y)&z;//将Y为0而Z为1的地方以1的方式记录下来
return y&((x&val1)|(~x&val1)) + (((~~(!x))>>1)&val2);
// 根据x将y1z0 根据x将y0z1
// 的地方更改 的地方更改
}
Markdown 0 字数 2 行数 当前行 2, 当前列 0 HTML 0 字数 0 段落 Menu Main workspace not synced.Sign in with GoogleSync your main workspace and unlock functionalities.WorkspacesSwitch to another workspace.SynchronizeSync your files in the Cloud.PublishExport your files to the web.HistoryTrack and restore file revisions.File propertiesAdd metadata and configure extensions. Table of contents Markdown cheat sheet Import from disk Export to disk Print More... 欢迎使用CSDN-markdown编辑器 这里输入标题~左侧是编辑区~我知道了右侧是预览区~发布文章点击这里发布~以下图标有改动我知道了管理博文发布成功并查看文章 文章摘要由系统生成复制链接分享到微信 生成分享卡片再写一篇保存卡片分享我的最新文章~卡片正在努力生产中…保存卡片
下一篇: CSAPP第十章学习日志