計算機系統——資料表示試驗
阿新 • • 發佈:2018-11-08
本次為一次計算機系統實驗,就是使用一些基本的運算子來實現函式功能。
ps做這些題讓我想起大一上學期剛學二進位制時被鵬哥支配的痛苦。
1.
/* * bitXor - 僅允許使用~和&來實現異或 * 例子: bitXor(4, 5) = 1 * 允許的操作符: ~ & * 最多操作符數目: 14 * 分值: 1 */
解題思路:簡單的異或,a⊕b = (¬a ∧ b) ∨ (a ∧¬b)但要求使用&,所以需要德摩根律
int bitXor(int x,int y) { return (~(~x&y)&~(x&~y));//((~x&y)|(x&~y)); }
2.
/* * tmin - 返回最小的二進位制補碼 * 允許的操作符: ! ~ & ^ | + << >> * 最多操作符數目: 4 * 分值: 1 */
解題思路:最小值為0x8000 0000,我們可以將1左移31位得到最小值。
int tmin(void) { return 1<<31; }
3.
/* * isTmax - 如果x是最大的二進位制補碼,返回1;否則,返回0 * 允許的操作符: ! ~ & ^ | + * 最多操作符數目: 10 * 分值: 2*/
解題思路:最大的二進位制補碼為0x7FFFFFFF,為判斷輸入是否為這一個數,我們只需要將其與最小的二進位制補碼與或一下判斷是否為0即可。
int isTmax(int x) { return !(x^~(1<<31)); }
4.
/* * negate - 返回-x * 例子: negate(1) = -1. * 允許的操作符: ! ~ & ^ | + << >> * 最多操作符數目: 5 * 分值: 2 */
解題思路:正數取反加一即為負數。
int negate(int x) { return (~x+1); }
5.
/* * allOddBits - 如果所有奇數位都為1則返回1;否則返回0 * 例子: allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1 * 允許的操作符: ! ~ & ^ | + << >> * 最多操作符數目: 12 * 分值: 2 */
解題思路::只有所有奇數位為1的數,與0x5555 5555進行&運算才會得到0。5->(0101)。故而需要得到0x5555 5555,將0x55(01010101)分別左移8、16、24得到3個數,然後將這三個數相加即可得到0x5555 5555。
int allOddBits(int x) { return !(~(x|(85+(85<<8)+(85<<16)+(85<<24)))); }
6.
/* * isAsciiDigit - 如果x是ascii碼中的0~9,返回1;否則返回0 * 例子: isAsciiDigit(0x35) = 1. * isAsciiDigit(0x3a) = 0. * isAsciiDigit(0x05) = 0. * 允許的操作符: ! ~ & ^ | + << >> * 最多操作符數目: 15 * 分值: 3 /*
解題思路:若x是數字,則x在‘0’~‘9’之間。可以用x-48>=0和x-58<0(x+~48+1>=0和x+~58+1<0)來計算。
int isAsciiDigit(int x) { return !((x+~48+1)>>31)&!!((x+~58+1)>>31); }