当前位置: 代码迷 >> 综合 >> CAPP DATALAB---LAB1
  详细解决方案

CAPP DATALAB---LAB1

热度:88   发布时间:2023-12-06 09:43:27.0

CAPP DATALAB—LAB1

一.环境配置

咱说实话也不知道环境配置,为啥要配置反正学长让配了,那咱就配[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lD0PYEph-1647779319302)(file:///D:\QQ文件保存\1715597938\Image\Group2\19\M%\19M%HY%I4[G@IC3N2%0SFFI.jpg)]

1、编译环境 g++ gcc

很简单哈,就上网上一搜,欸 ubuntu配置gcc g++环境一堆的教程,实在不想搜我把这个网站放这里

环境配置非常的简单哈。

2.调试环境 gdb-peda ,gdb

也是同上的方法,我不会,别人能也不会嘛[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-736bNxc5-1647779319304)(file:///D:\QQ文件保存\1715597938\Image\Group2\19\M%\19M%HY%I4[G@IC3N2%0SFFI.jpg)]

同样 不想找的我把链接放里面链接。也是非常的简单啊。

3.下载vscode

这个 直接在虚拟机的浏览器上找就行了,然后安装,要是也不会。链接dddd。

二.做题datalab-1

我开始也不会,好像就从头到尾三个指令

make dtest//更新文本
./dtest -g//运行
./dtest //查看错误

其实里面的洋文我也看不懂,翻译过来也是半懂。有时候甚至开始怀疑自己是不是made in china

1.bitxor

这个题,我是很不理解, 用&和~运算实现^

/*1* bitXor - x^y using only ~ and &* Example: bitXor(4, 5) = 1* Legal ops: ~ &* Max ops: 14* Rating: 1*/
int bitXor(int x, int y) {
    

题意就是用and 与运算 与非运算 使X Y 实现异或运算 就是用 加减法实现乘除法 大概就是这个意思。

int bitXor(int x, int y) {
    int xor=~(~x&~y)&~(x&y);return xor;

这个刚开始做 确实不会 然后查了一下 是运用了离散数学 的德摩根律

2.tmin

tmin - return minimum two's complement integer *   Legal ops: ! ~ & ^ | + << >>*   Max ops: 4*   Rating: 1*/
int tmin(void) {
    int a = 1;return a << 31;

这个题是取32位数的最小值 之前听那个滴水逆向课的时候讲过最小值就是符号位是1其余全为0 即

1<<31

3.isTmax

* isTmax - returns 1 if x is the maximum, two's complement number,*     and 0 otherwise *   Legal ops: ! ~ & ^ | +*   Max ops: 10*   Rating: 1*/
int isTmax(int x) {
    

这道题的意思就是 判断X是不是最大值 是的话 返回1 否则返回0

思路就是 假设X为最大值0x7fffffff 加1就为 0x80000000

则x+a=0xffffffff a取反!a=0 使x=x+a 即x=32个1 ~x=32个0 所以 要使之返回1则 !(x+a)中的x+a=0 即x=0 a=0

int isTmax(int x) {
    int a=x+1;x=x+a;a=!a;x=~x;return !(x+a);

4.alloddbits

 allOddBits - return 1 if all odd-numbered bits in word set to 1*   where bits are numbered from 0 (least significant) to 31 (most significant)*   Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1*   Legal ops: ! ~ & ^ | + << >>*   Max ops: 12*   Rating: 2*

题目的意思就是如果如果字中所有奇数位都设置为1,则返回1其余的返回0

先int一个a定义为 0xaaaaaaaa 转成二进制就是10101010101010101010101010101010。

让他与X进行与运算 即 只有当x的奇数为为1时进行与运算时不变 且进行与运算后 x奇数位全为1时 x=a

让x^a=0 则 后面的返回值设为 !(x^a)即可达成题目需求。

int allOddBits(int x) {
    int a=0xaaaaaaaa;int s=(a&x)^a;return !s;

5.nagate

negate - return -x *   Example: negate(1) = -1.*   Legal ops: ! ~ & ^ | + << >>*   Max ops: 5*   Rating: 2

返回-x

很简单 取x的补码+1

int negate(int x) {
    
int a=~x;x=a+1;return x;

6.isasciidigit

 isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')*   Example: isAsciiDigit(0x35) = 1.*            isAsciiDigit(0x3a) = 0.*            isAsciiDigit(0x05) = 0.*   Legal ops: ! ~ & ^ | + << >>*   Max ops: 15*   Rating: 3*/

这个就是比较大小

如果 0x30<=x<=0x39就返回 1否则返回0。

思路就是 看符号位

如果 x-30 >0则他的符号位一定是0 反之为1

同理 39-x>0则他的符号位肯定也是0 反之为1

完成 减法运算可以用一个数加上他的补码+1

取符号位的操作就是 右移31位

int isAsciiDigit(int x) {
    
int a=x+(~(0x30)+1);
int b=(~x+1)+0x39;
int c=a>>31;
int d=b>>31;
int f=!c;//(取反让0变1)return f&!d;

7.conditional

 conditional - same as x ? y : z *   Example: conditional(2,4,5) = 4*   Legal ops: ! ~ & ^ | + << >>*   Max ops: 16*   Rating: 3

这个题的意思就是实现三目运算

这个题不太会 。寄了

7.conditional

 conditional - same as x ? y : z *   Example: conditional(2,4,5) = 4*   Legal ops: ! ~ & ^ | + << >>*   Max ops: 16*   Rating: 3

这个题的意思就是实现三目运算

这个题不太会 。寄了