计算机系统——数据表示试验

本次为一次计算机系统实验,就是使用一些基本的运算符来实现函数功能。

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

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/9822878.html