标签:计算 数据表示 函数 需要 运算 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); }
标签:计算 数据表示 函数 需要 运算 ascii 数字 否则 dbi
原文地址:https://www.cnblogs.com/wkfvawl/p/9822878.html