1.替換bits.c中各個函數中的return,格式要求如下所示: int Funct(arg1, arg2, …) { /* brief description of how your implementation works */ int var1 = Expr1; … int varM = ExprM;
varJ = ExprJ;...varN = ExprN;return ExprR;
} 其中,每一個“Expr”只能使用如下規則: ① 數字只能使用0到255(0xff),不能使用像0xffffffff這樣大的數字 ② 函數參數和局部變量(沒有全局變量) ③ 一元運算目:! ~ ④ 二元運算目:& ^ | + << >> 2.bits.c中所給的15個函數都是缺失的,需要用上每個函數被允許的操作去實現所要求的功能。 3.下面的操作不被允許: ① 使用任何控制結構,如if, do, while, for, switch等。 ② 定義或使用任何宏。 ③ 在此文件中定義任何其他函數。 ④ 調用任何庫函數。 ⑤ 使用任何其他的操作,如&&, ||, -, or ?: ⑥ 使用任何形式的casting ⑦ 使用除int以外的任何數據類型。這意味著你不能使用數組、結構等。 對于需要你執行浮點運算的問題,編碼規則較不嚴格。允許使用循環和條件控制也可以同時使用int和unsigned??梢允褂萌我庹麛岛蜔o符號常量。
/* * bitAnd - x&y using only ~ and | * Example: bitAnd(6, 5)= 4* Legal ops: ~ |* Max ops: 8* Rating: 1*/
int bitAnd(int x, int y){return ~((~x)|(~y));}
代碼解釋:使用~與|實現按位與,真值表為(每一位):
由于最高限制次數為8次,那么只能使用德摩根律,得到x&y=(X|~Y)即可。 2、
/* * getByte - Extract byte n from word x* Bytes numbered from 0 (LSB) to 3 (MSB)* Examples: getByte(0x12345678,1)= 0x56* Legal ops: ! ~ & ^ | + <<>>* Max ops: 6* Rating: 2*/
int getByte(int x, int n){return((x>>(n<<3))&0xff);}
/*
* logicalShift - shift x to the right by n, using a logical shift* Can assume that 0 <= n <= 31* Examples: logicalShift(0x87654321,4)= 0x08765432* Legal ops: ! ~ & ^ | + <<>>* Max ops: 20* Rating: 3 */
int logicalShift(int x, int n){return ~((((1<<31)&x)>>n)<<1)&(x>>n);}
/** fitsBits - return 1 if x can be represented as an * n-bit, two's complement integer.* 1 <= n <= 32* Examples: fitsBits(5,3)= 0, fitsBits(-4,3)= 1* Legal ops: ! ~ & ^ | + <<>>* Max ops: 15* Rating: 2*/
int fitsBits(int x, int n){//get 32-n;return!(((x >>(n+(~0))) + 1)>>1);}
代碼解釋:判斷x是否能被n位二進制數表示,即x是否在-2(n-1)到2(n-1)-1范圍內 8、
/** divpwr2 - Compute x/(2^n), for 0 <= n <= 30* Round toward zero* Examples: divpwr2(15,1)= 7, divpwr2(-33,4)= -2* Legal ops: ! ~ & ^ | + <<>>* Max ops: 15* Rating: 2*/
int divpwr2(int x, int n){return(x+((x>>31)&((1<<n)+(~0))))>>n;}
/** ilog2 - return floor(log base 2 of x), where x > 0* Example: ilog2(16)= 4* Legal ops: ! ~ & ^ | + <<>>* Max ops: 90* Rating: 4*/
int ilog2(int x){int bitsNumber=0;bitsNumber=(!!(x>>16))<<4;//bitsNumber=bitsNumber+((!!(x>>(bitsNumber+8)))<<3);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+4)))<<2);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+2)))<<1);bitsNumber=bitsNumber+(!!(x>>(bitsNumber+1)));//for non zero bitsNumber, it should add 0//for zero bitsNumber, it should subtract 1bitsNumber=bitsNumber+(!!bitsNumber)+(~0)+(!(1^x));//當x為0時,還需要減一才能得到正確值。return bitsNumber;}
/** float_neg - Return bit-level equivalent of expression -f for* floating point argument f.* Both the argument and result are passed as unsigned int's, but* they are to be interpreted as the bit-level representations of* single-precision floating point values.* When argument is NaN, return argument.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 10* Rating: 2*/
unsigned float_neg(unsigned uf){unsigned result;unsigned tmp;result=uf^0x80000000; //將符號位改反 -f tmp=uf &(0x7fffffff);if(tmp > 0x7f800000)//此時是NaNresult = uf;return result;}
/** float_i2f - Return bit-level equivalent of expression (float) x* Result is returned as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point values.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/
unsigned float_i2f(int x){unsigned shiftLeft=0;unsigned afterShift, tmp, flag;unsigned absX=x;unsigned sign=0;//special caseif(x==0)return 0;//if x < 0, sign = 1000...,abs_x = -xif(x<0){sign=0x80000000;absX=-x;}afterShift=absX;//count shift_left and after_shiftwhile(1){tmp=afterShift;afterShift<<=1;shiftLeft++;if(tmp & 0x80000000)break;// }if((afterShift & 0x01ff)>0x0100)flag=1;elseif((afterShift & 0x03ff)==0x0300)flag=1;elseflag=0;return sign + (afterShift>>9) + ((159-shiftLeft)<<23) + flag;}
/** float_twice - Return bit-level equivalent of expression 2*f for* floating point argument f.* Both the argument and result are passed as unsigned int's, but* they are to be interpreted as the bit-level representation of* single-precision floating point values.* When argument is NaN, return argument* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/
unsigned float_twice(unsigned uf){unsigned f = uf;if((f & 0x7F800000)== 0) //{//左移一位f =((f & 0x007FFFFF)<< 1)|(0x80000000 & f);//007fff---11111111111111111111111 23bit }elseif((f & 0x7F800000)!= 0x7F800000){f =f + 0x00800000; //100000 23}return f;}