




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程實驗報告 課 程 名 稱: 計算機組成與結構 實驗項目名稱: Datalab 專 業 班 級: 姓 名: 學 號: 指 導 教 師: 趙歡 完 成 時 間: 2016 年 4 月 12 日信息科學與工程學院實驗題目:Datalab實驗目的:按實驗要求完善 bit.c 里的各個函數,實現其功能,并通過 btest 的測試實驗環境:聯想ThinkPad E545,Ubuntu14(32位)實驗內容及操作步驟:第一步: 完善 bits.c 里的各個函數,代碼如下:(1).bitAnd 函數,要求如下: /* * bitAnd - x&y using only and | * Example: b
2、itAnd(6, 5) = 4 * Legal ops: | * Max ops: 8 * Rating: 1 */#題目說明:不使用&符號實現兩個數的位與運算;#思路 :德摩根定律 (x & y) = (x) |(y) (x & y) = (x) |(y)#代碼:int bitAnd(int x, int y) return (x)|(y);(2).getByte 函數,要求如下:/* * getByte - Extract byte n from word x * Bytes numbered from 0 (LSB) to 3 (MSB) * Examples: getByte(0x12
3、345678,1) = 0x56 * Legal ops: ! & | + * Max ops: 6 * Rating: 2 */ #題目說明:要求從數X中取出第n個字節#思路:1.首先,將需要保留的字節移到最低位字節(編號為00的字節)上,即右移n 個byte(每個byte有8位),也就是n*8(n(n3)& 0xff; (3).logicalShift 函數,要求如下: /* * logicalShift - shift x to the right by n, using a logical shift * Can assume that 0 = n = 31 * Examples: l
4、ogicalShift(0x87654321,4) = 0x08765432 * Legal ops: ! & | + * Max ops: 20 * Rating: 3 */ #題目說明:用算術右移實現邏輯右移功能#思路: 1、邏輯右移,高位補0。 2、不管是正數還是負數亦或是0,算術右移n位后 位與&一個前n位為0,后面的位都為1的數(00001111(n個0),都能把移位后高位的符號變為0(如果原來為0就保持不變);3.獲得一個前位為0的數:將(1 31)得到0x80000000 ,算術右移n-1位,即(1n)1 ; 得到一個前n位為1,后32-n為0的數(11110000(n個1),再
5、按位取反(yn)n)即可實現邏輯右移;#代碼: int logicalShift(int x, int n) int y=1; return (yn)n); (4).bitCount 函數,要求如下: /* * bitCount - returns count of number of 1s in word * Examples: bitCount(5) = 2, bitCount(7) = 3 * Legal ops: ! & | + * Max ops: 40 * Rating: 4 */#題目說明:返回32位數字串中1的個數;#思路:1.依次檢測x 的每一位,ops 會超出所給限操作符數
6、;2.類似,由于bitcount 結果不會超過32,故可以利用一個32 位二進制數3.將每次的檢測位數設定為4 位的;4.初始化tmp=0x1111,用來依次檢測xi 的0,8,16,24 位是否為1;5.利用val 累加分別計算4 個字節上1 的個數,val 的每個字節的值為對應x 每個字節上的1 的個數;6.最后將得到val 四個字節的值相加,即x 四個字節上1 的個數的和,保留最低字節的信息,為最后結果。#代碼: int bitCount(int x) int tmp=(0x018|0x01)8|0x01)8|0x01)1); /檢測x 的1,9,17,25 位是否為1val+=tmp&
7、(x2); /.val+=tmp&(x3);val+=tmp&(x4);val+=tmp&(x5);val+=tmp&(x6);val+=tmp&(x7); /檢測x 的7,15,23,31 位是否為1val+=(val16); /將val 的高16 位加到低16 位上val+=(val8); /再將val 的高8 位加到低8 位上return val&0xff; /保留val 的最低byte 信息為最終結果(5).bang 函數,要求如下: /* * bang - Compute !x without using ! * Examples: bang(3) = 0, bang(0) = 1
8、* Legal ops: & | + * Max ops: 12 * Rating: 4 */#題目說明:不施用!符號實現!x的功能(即!0=1,!(other number)=1);#思路: 1. 0的相反數仍為0。 2.其他整數的相反數符號位位必然與原數相反(原數和相反數必然符號位是其中1個為0,另一個為1); 3.一個不為0的數原數和相反數相或的結果符號位必然為1; 0原數和相反數相或的結果符號位必然為0;4.將原數和相反數相或的結果的符號位移到最低位取反后 &上0x01就可以返回符號位的反(即相或的結果符號位為0則返回1,否則返回0);5.一個數取相反數的規則跟負數補碼規則一樣,x +
9、1,按位取反加1即可;#代碼:int bang(int x) int tmp = x +1;tmp = x | tmp;tmp = tmp 31; return (tmp &0x01);(6).tmin函數,要求如下:/* * tmin - return minimum twos complement integer * Legal ops: ! & | + * Max ops: 4 * Rating: 1 */#題目說明:求補碼編碼的最小數;#思路:補碼編碼的公式 :從公式可以可以看出當最高位為1,而其余位為0的時候,獲得最小值。 我們要求的是32位的整數,所以最小值為0x80000000簡
10、寫就是0x0131,也就是1左移31位到最高位#代碼:int tmin(void) return 0x0131;(7). fitsBits函數,要求如下:/* * fitsBits - return 1 if x can be represented as an * n-bit, twos complement integer. * 1 = n = 32 * Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1 * Legal ops: ! & | + * Max ops: 15 * Rating: 2 */#題目說明:求給定的一個數是否能用n位補碼表
11、示;#思路:x的前32-n都為0或1,可以假定第n-1位為符號位,通過先算術左移再算術右移后比較與原數是否有差別;有差別說明不能表示;如果有差別,與原數亦或后不為0,否則為0,再用邏輯非!取將有差別的返回0,無差別的返回1;#代碼:int fitsBits(int x, int n) int s=32+(n+1); /*32+(n+1)=32-n*/ return !(x(xs); (8).divpwr2(除法)函數,要求如下:/* * divpwr2 - Compute x/(2n), for 0 = n = 30 * Round toward zero * Examples: divpwr
12、2(15,1) = 7, divpwr2(-33,4) = -2 * Legal ops: ! & | + * Max ops: 15 * Rating: 2 */題目說明:將一個數除以(2n),有余數則往靠近0的方向取舍;#思路:*分 x 為負數和非負數兩種情況:當x 為非負數時,直接將x 右移n 位即可;當x 為負數時,如果x 移出的位中不全為零,即有余數,則結果為右移n 位后的結果加1;#代碼:int divpwr2(int x, int n) int s=!(x31); /取x 的符號位的bool 值int t=(1n)+0; /t=(1n)+(!lown)&s);(9). negat
13、e函數,要求如下:/* * negate - return -x * Example: negate(1) = -1. * Legal ops: ! & | + * Max ops: 5 * Rating: 2 */#題目說明:取一個數的相反數;#思路:一個數的相反數正好就是對其每一位取反后加一,跟負數的補碼規則相似,為x+1,無論正負數都適用。#代碼:int negate(int x) return x+1;(10). isPositive函數,要求如下:/* * isPositive - return 1 if x 0, return 0 otherwise * Example: isPo
14、sitive(-1) = 0. * Legal ops: ! & | + * Max ops: 8 * Rating: 3 */#題目說明:一個數為正數,則返回1,否則返回0;#思路:1.正數的符號位為0,負數的符號位為1,如果是一個非0的數,返回符號位的反即可,0單獨考慮;2. 如果一個數x為0,則!x =1 ,!x =0;否則,一個不為0的數!x =0,!x =1;#代碼:int isPositive(int x) int s=!(x31);/x右移31位,得到符號位,若為正數,s=1 return s&!x; /返回x為正數滿足的條件(11). isLessOrEqual函數,要求如下:
15、/* * isLessOrEqual - if x = y then return 1, else return 0 * Example: isLessOrEqual(4,5) = 1. * Legal ops: ! & | + * Max ops: 24 * Rating: 3 */#題目說明:如果x = y則返回1,否則返回0;#思路:1. 判斷是否有x=0 是否成立,轉化成判斷y-x 的正負;分為同號和異號兩種情況:2.當x 和y 同號時,y-x 不會發生溢出,判斷y-x 是否為非負數即可;3.當x 和y 異號時,y-x 可能會發生溢出,其結果一定和y(也就是!x)的符號一致。#代碼:i
16、nt isLessOrEqual(int x, int y) int sx=!(x31);/取x的符號位,為bool類型值int sy=!(y31);/ 取y的符號位,為bool類型值int z=y+(x+1);/z=y-x,x求反加一得-x(-x絕對值不變)int s=!(z31);/ 取z的符號位,為bool類型值 return (!(sxsy)&s)|(sxsy)&sx);/x,y同號;x,y異號(12). ilog2函數,要求如下:/* * ilog2 - return floor(log base 2 of x), where x 0 * Example: ilog2(16) = 4
17、 * Legal ops: ! & | + * Max ops: 90 * Rating: 4 */#題目說明:求一個數的log2的值;#思路:*即求32 位二進制x 的最高位1 對應的log base 2;*由x0,ilog 的結果不會超過31,可以想到用5 位二進制來表示;*依次折半累加得出最高位的權,方法如下(設結果ret=ijklm(2)):首先判斷x 的高16 位是否全部為0,ret+=24*i,x 相應右移16 位;再判斷右移后x 的高8 位是否全部為0,ret+=23*j,x 相應右移8 位;依次累加得出結果ret。#代碼:int ilog2(int x) int s,s1,s2
18、,s3,s4,s5;s=!(x16); /判斷最高位是否在高16 位上s1=s=s1; /x 相應右移s=!(x8); /判斷最高位是否在高8 位上s2=s=s2; /x 相應右移s=!(x4); /.s3=s=s3;s=!(x2);s4=s=s4;s=!(x1);s5=s; /最后一位return s1+s2+s3+s4+s5;/累加得出結果(13). float_neg函數,要求如下:/* * float_neg - Return bit-level equivalent of expression -f for * floating point argument f. * Both th
19、e argument and result are passed as unsigned ints, 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
20、 */#題目說明:將一個32位int型數解讀為單精度浮點型數據f,返回-f;#思路:1.若這個數被解讀為特殊值(階碼位全1),則返回原數;若為非特殊值,則直接對符號位(即最高位)取反;2.使用異或操作符。對1求異或,等價于對1求反;對0求異或,等價于保持原數;當需要對一組數中一部分求反,一部分保持原數時,就可以使用異或運算; 3.判斷一個浮點數是否為特殊值:截取其階碼位和小數位與階碼位全1,小數位全0(即0x7fffffff)比較,若大于它,則必然為特殊值; 4.截取數據:可以參考getByte,利用與運算&,需要截取的數和1與,需要清零的數和0與,即可保留需要的數據部分#代碼:unsigne
21、d float_neg(unsigned uf) unsigned result ,down; down = uf & (0x7fffffff);if(down 0x7f8fffff)result = uf;elseresult = uf 0x80000000; return result;(14). float_i2f函數,要求如下:/* * float_i2f - Return bit-level equivalent of expression (float) x * Result is returned as unsigned int, but * it is to be interp
22、reted 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 */#思路:這個函數是將一個整形數,轉化為浮點數,浮點數的符號只取決于第一位,所以對負數作取絕對值處理之后,所有數都可以按照同一種方法處理;將二進制數左邊的零位全部移出,直到移到“1”位為止,移出的位數shiftleft則為32位中前
23、面“0”的個數,因此32-shiftleft代表的就是階碼的原碼部分,再加上127的移碼就可以得到最終的階碼;移完0之后得到的aftershift這串數,就是小數部分,所以最后將aftershift右移9位,127+32-shiftleft左移23位,最前面加上符號位,即可得到轉移后的數字; #代碼:unsigned float_i2f(int x) unsigned shiftLeft=0; unsigned afterShift, tmp, flag; unsigned absX=x; unsigned sign=0; /special case if (x=0) return 0; /i
24、f x 0, sign = 1000.,abs_x = -x if (x0) sign=0x80000000; absX=-x; afterShift=absX; /count shift_left and after_shift while (1) tmp=afterShift; afterShift0x0100) flag=1; else if (afterShift & 0x03ff)=0x0300) flag=1; else flag=0; return sign + (afterShift9) + (159-shiftLeft)23) + flag;(14)float_twice函數
25、,要求如下:/* * float_twice - Return bit-level equivalent of expression 2*f for * floating point argument f. * Both the argument and result are passed as unsigned ints, 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
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 展廳建設合同協議
- 定制工廠自裝合同協議
- 建造凍庫合同協議
- 學校廚房配送合同協議
- 委托外部加工合同協議
- 子女房產分配協議書模板
- 延期解除合同協議
- 孵化合作養殖合同協議
- 家裝建材運輸合同協議
- 延期發貨合同協議
- 青島商場分級管理制度
- 廣東省歷年中考作文題(2000-2023)
- 書法藝術療愈在書法教育中的實踐與應用研究
- 射頻電路封裝設計與工藝實現方法研究
- 線路工初級測試題含答案
- 體檢中心質量控制指南
- 2025年廣東中考試題數學及答案
- 四川2024年12月四川省內江市事業單位公開選調2名工作人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 化工設計知到智慧樹章節測試課后答案2024年秋浙江大學
- 各種注射技術常見并發癥的預防及處理
- 工程竣工驗收流程匯報
評論
0/150
提交評論