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
这个题的意思就是实现三目运算
这个题不太会 。寄了