標籤:計算 資料表示 函數 需要 運算 ascii 數字 否則 dbi
本次為一次電腦系統實驗,就是使用一些基本的運算子來實現函數功能。
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);}
電腦系統——資料表示實驗