datalab实验
环境安装
第一步下载虚拟机
https://www.vmware.com/
虚拟机官网
第二步下载镜像
https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso?_ga=2.90337498.1753593614.1646563933-382193276.1643206315
下载链接,如果不能用或者想安装其它版本的,就删掉后面的去官网找。
第三部配置镜像文件
创建新的虚拟机时将镜像文件导入即可
第四步更新gcc
sudo apt install build-essential gcc-multilib g++-multilib
输入即可
解题
1. bitXor
题目要求用“与”和“非”表达异或,
先找异或表达式a ^ b=( ~ a & b ) | ( a & ~ b ),发现只要将“或”替换成“与”和“非”的表达式即可,有因为“与”和“或”完全相反,得a & b = ~ ( ~ a | ~ b );a | b = ~ ( ~ a & ~ b )。因此 a ^ b = ~ ( ~ ( ~ a & b ) & ~ ( a & ~ b ));
int bitXor(int x, int y) {
return ~(~(~x&y)&~(x&~y));
}
2. tmin
要求返回2进制的最小值,
即:0x80000000。允许使用位移符直接将1移到第32位即可。1<<31.
int tmin(void) {
int a = 3;
return a << 31;
}
3.isTmax
判断x是不是最大值
最大值加一等于二进制最小值:80000000,80000000加它(800000000)取反为ffffffff,再取反为全0,!后即为true,但如果这个数是ffffffff,那么它加一后(00000000)取反加它(00000000)本身也是ffffffff,再取反为全0,!后也为true。根据下图第一次运算到E后从下面的C接着运算排除ffffffff。
int isTmax(int x) {
int i = x+1;
x = x + i;
x = ~x;
x=(x+!i);
return !x;
}
4. allOddBits
判断奇数为上是否全为一
先给出一个全一的数,和x先与后异或,如果x和给定的数在奇数位上相同,则结果将为零。
左后用!判断
int allOddBits(int x) {
int a = 0xAA + (0xAA<<8);
a = a + (a<<16);//令a=AAAAAAAA
return !((x&a)^a);//如果位置上有不是一的,那么括号内的结果不为零,!后返回0;
}
5. negate
求相反
根据~ a = - ( a + 1 )得:-