一.环境搭建
**
首先要搞一个ubantu的虚拟机,具体自行百度
搞好虚拟机开始搭建环境,右键打开终端,然后输入以下指令
apt-get update //更新apt软件源
apt-get install sudo //安装sudo
sudo apt-get install build-essential //安装c/c++编译环境
sudo apt-get install gcc-multilib //补充gcc的完整环境(gcc-multilib)
sudo apt-get install gdb //安装gdb
sudo apt-get install make //安装make
如何做题及如何检查对错,输入以下指令(以第一道题bitXor为例)
make btest
./btest -f bitXor
./btest -g //总览所有题的得分
得满分就说明做对了
**
二.lab1wp
int规则(百度翻译的,应该能看懂)
整数常量0到255(0xFF),包括在内。
不允许使用大常量,例如0xffffffff。
明确禁止您:
1.使用任何控件构造,例如if、do、while、for、switch等。
2.定义或使用任何宏。
3.在此文件中定义任何附加功能。
4.调用任何函数。
5.使用任何其他操作,如&&、| |、-、or、?:
6.使用任何形式的铸造。
7.使用int以外的任何数据类型。这意味着
无法使用数组、结构或联合。
1.bitxor
//1
/*
* bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
*/
题意就是用~、&来实现异或
~:对于二进制的每一位,将1变为0,将0变为1
对于x,y,只能有两种&组合,x&y和~x & ~y,如果是 ~x&y,或者是 ~y&x,都是行不通,要么都取反,要么都不取
这里就用4,5来尝试一下,4&5=0100,~4 & ~5=1010
这下就是进行不断尝试组合,出答案
int bitXor(int x, int y) {
return ~(x & y)&~(~x&~y);
}
2.tmin
/*
* tmin - return minimum two's complement integer
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 4
* Rating: 1
*/
题意是求二进制补码的最小值,0x10000000是最小值,但是只能输入0到255(0xFF)之间的,所以要用到左移<<,具体如下:
int tmin(void) {
return 1 << 31;
}
3.isTmax
//2
/*
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
题意是如果接受的x为二进制最大值,就返回1,否则为0
二进制最大值为0x7FFF FFFF,假设它就是x,则x+1就是0x8000 0000,这个时候将二者异或就得到了0xFFFF FFFF,再加一个 ‘~’ ,就得到了0,最后return时再用逻辑非即可。但是0xFFFF FFFF与其+1异或后也是0xFFFF FFFF,这个时候再对其+1的数两次 ‘!’,为0,结合一下进行与运算
具体实现如下:
int isTmax(int x) {
int r=x+1;
r=~(x^r);
return !(r^x) &!!(x+1);
}
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。
满足所有奇数位为1的数只有0xAAAA AAAA和0xFFFF FFFF,这个时候就要用到异或来判断了
首先假设x是0xAAAA AAAA,要弄出一个与x异或的值0xAAAA AAAA,这样使其为0后,再用逻辑非变成1,
如果x为0xFFFF FFFF ,这里需要再多加一条与运算,使其先变为0xAAAA AAAA再异或就得到0了
现在还有一个问题就是0xAAAA AAAA怎么给变量赋上值,这里就要用到逻辑左移和异或结合得到
具体如下: