1. 程式人生 > >計算機系統——數據表示試驗

計算機系統——數據表示試驗

之間 異或 min 相加 ret 函數功能 數據 我想 rsquo

本次為一次計算機系統實驗,就是使用一些基本的運算符來實現函數功能。

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);
}

計算機系統——數據表示試驗