【CSAPP】-datalab實驗

實驗原理與內容

本實驗每位學生拿到一個datalab-handout.tar文件。學生可以通過U盤、網盤、虛擬機共享文件等方式將其導入到Unbuntu實驗環境中,選擇合適位置存放。然后在Ubuntu環境下解壓。解壓后,根據文件中的敘述和要求更改bits.c文件。本次實驗的主要操作方式為:使用C語言的位操作符實現題目要求。

需要完成bits.c中下列函數功能,具體分為三大類:位操作、補碼運算和浮點數操作。

1.位操作

表1列出了bits.c中一組操作和測試位組的函數。其中,“級別”欄指出各函數的難度等級(對應于該函數的實驗分值),“功能”欄給出函數應實現的輸出(即功能),“約束條件”欄指出你的函數實現必須滿足的編碼規則(具體請查看bits.c中相應函數注釋),“最多操作符數量”指出你的函數實現中允許使用的操作符的最大數量。

也可參考tests.c中對應的測試函數來了解所需實現的功能,但是注意這些測試函數并不滿足目標函數必須遵循的編碼約束條件,只能用做關于目標函數正確行為的參考。

表1 位操作題目列表

本題分數

函數名

功能

約束條件

最多操作符數

1

isZero

判斷變量x是否為0。如果為0,則返回1;否則,返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ << ?>>

2

1

specialBits

構建0xffca3fff,并返回。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ << ?>>

3

1

upperBits

根據輸入的變量n,構建一個高n位為1其他位為0的數,并返回該值。

注:0<= n?<=32

僅可以使用以下操作符:?! ?~ ?& ?^ ?| ?+ << ?>>

10

1

bitMatch

構建一個比特序列(int型),構成規則如下:如果x和y在某一個bit位置的值相同,則此序列的相應位置為1,否則該位置值為0。

僅可以使用以下操作符: ~?&

14

1

bitOr

計算按比特或(x?|?y),并將計算結果返回。

僅可以使用以下操作符: ~?&

8

4

logicalNeg

使用位操作符實現邏輯非(!x)操作,并將取邏輯非之后的結果返回。

僅可以使用以下操作符:?~ ?& ?^ ?| ?+ ?<< ?>>

12

4

bitParity

如果x中包含奇數個0,則返回1;否則返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

20

2

byteSwap

將x的第n字節和第m字節交換,

0?<= n <= 3,?

0?<= m <= 3,

然后將交換后的值返回。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

25

2

getByte

提取x的第n個字節。0 <= n?<= 3?(0代表最最低為字節,3代表最高位字節),并將其返回。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

6

2

oddBits

返回一個32bit數,這數的所有第奇數個bit位置的值為1。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

8

3

replaceByte

將x的第n個字節用 c?進行替換,

0 <= n <= 3,?0 <= c <= 255

并將替換后的結果返回。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

10

3

rotateLeft

將x向左循環移位n個bit。循環移位是指左邊移除去的比特自動填充到右邊空出的位置上。 0 <= n <= 31,并將循環移位后的值返回。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

25

2.補碼運算

表2列出了bits.c中一組使用整數的補碼表示的函數。可參考bits.c中注釋說明和tests.c中對應的測試函數了解其更多具體信息。

2 補碼運算題目列表

本題分數

函數名

功能

約束條件

最多操作符數

2

negate

將輸入參數x的值取相反數,返回-x。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

5

4

absVal

計算變量x的絕對值,并將其絕對值返回。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

10

3

isGreater

如果x?>?y,則返回1,否則返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

24

2

isNegative

如果x?< 0,返回1;否則返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

6

4

isPower2

如果x是2的整數次冪,則返回1;否則返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

20

3

addOK

如果x+y沒有溢出,則返回1;否則返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

20

3

subtractionOK

如果x-y沒有溢出,則返回1;否則返回0。

僅可以使用以下操作符: ! ?~ ?& ?^ ?| ?+ ?<< ?>>

20

3.浮點數操作

表3列出了bits.c中一組浮點數二進制表示的操作函數。可參考bits.c中注釋說明和tests.c中對應的測試函數了解其更多具體信息。注意輸入參數和返回結果均為unsigned int類型,但應作為單精度浮點數解釋其32 bit二進制表示對應的值。

表3 浮點數操作題目列表

本題分數

函數名

功能

約束條件

最多操作符數

2

floatAbsVal

通過bit級操作返回一個float型浮點數的絕對值。如果輸入參數為NaN,則直接返回輸入參數的原值。

可以使用任何的操作符,包括||和&&。也可以使用if,while。

10

2

floatIsEqual

判斷兩個浮點數是否相等,如果相等則返回1,否則返回0。

如果輸入參數中含有NaN,則返回0。

注:+0和-0被當作相等的情況對待。

可以使用任何的操作符,包括||和&&。也可以使用if,while。

25

實驗過程與結果(可貼圖)


安裝gcc和ubuntu


isZero函數

isZero函數可能會接受一個數字作為輸入,然后返回一個布爾值,該布爾值表示該數字是否為零。如果是零,函數返回True;如果不是零,函數返回False。

Negate函數

這個函數將接受一個數值作為輸入,并返回其相反數。如果輸入是正數1,則返回-1;如果輸入是負數-1,則返回1;如果輸入是零0,則返回0。

specialBits函數

這個函數目前學的還不是很懂,去一個地址再返回一個新的地址。


upperBits函數

這個函數檢查函數為零的位,不為零跳到下一位,直到所有位為非零為止。
bitMatch函數


這個函數會返回一個x與y相等的位,用&操作符能恰好解決。

bitOr函數


這個函數會返回一個x與y相或的數,先對兩個數進行取反,用&操作符最后用~操作符能恰好解決。

AbsVal函數

absval 函數用于計算一個數的絕對值。它接受一個數值作為輸入,并返回該數值的絕對值。
我們可以先對數值進行左移再取反,最后結合異或操作符,能使函數達到這個功能。


logicalNeg函數

這個函數實現了如果x為0,則結果為0;如果x不為0,則結果為-1的補碼表示。
將上一步的結果+1,得到0或1,就可以實現邏輯非操作。


bitParity函數

這個函數巧妙運用左移和右移操作符。

Byteswap函數


這個函數可以實現字節轉換,我們可以巧妙運用左移和右移操作符,從而實現這個功能。

Getbyte函數


這個函數主要是要知道有效字節的位置,我們用右移操作符和左移操作符尋到最低位置,在用&0xff找到有效位的8位,就是要找的字節。


Isgreater函數


這個函數可以使得返回一個較大的值,類似max。


Isnegative函數


這個函數可以實現判斷輸入整數是否為負數的的操作,負數返回1,其它返回0。
巧妙運用右移操作符和取反,可以達到此效果。


Ispower2函數


這個函數實現判斷x是不是為2的冪的操作。

Addok函數

這個函數可以實現兩個數相加的值,判斷這個值是不是溢出的操作,巧妙運用非操作符可以實現此功能。


Subtractionok函數

這個函數可以發現兩個數的差,有沒有造成溢出的操作,巧妙運用非操作符可以實現此功能。


Oddbits函數


這個函數可以使用位移和按位或運算符來構建出結果,從而返回所有奇數位設置為1的操作


Replacebyte函數

這個函數可以計算出需要進行位移的位數,然后分別創建一個用于清除和設置的掩碼。最后,我們使用這些掩碼對x進行操作,從而實現了替換字節的操作。


Rotateleft函數

這個函數可以使用位操作符 << 來實現左旋轉操作。

Floatabsval函數

這個函數可以檢查絕對值是否大于單精度浮點數表示的最大值,是,說明是NaN,直接返回原始值;不是返回絕對值。就可以實現返回浮點數絕對值的操作。

實驗總結

在實驗過程中,我們首先學習了整數和浮點數的二進制編碼表示,了解了如何將十進制數轉換為二進制數以及如何在計算機中存儲和表示整數和浮點數。我們還學習了如何使用位操作來對二進制數進行操作,例如按位與、按位或、按位異或等。這些操作在計算機底層原理中非常重要,因為它們可以讓我們更深入地理解計算機如何處理數據。我們通過實現一組給定功能的函數來加深對數據二進制編碼表示的了解。這些函數包括加減乘除、位移運算、位操作等。在實現這些函數的過程中,我們不僅學會了如何使用位操作和算術運算來處理數據,還了解了不同類型的數據如何進行比較和運算。通過這次實驗,我們不僅掌握了計算機中整數和浮點數的二進制編碼表示,還學會了如何使用有限類型和數量的運算操作來實現一組給定功能的函數。這些知識和技能對我們今后的學習和工作都具有重要意義,因為它們可以幫助我們更好地理解計算機底層原理、編程和算法設計。


csapp的第一個實驗,函數確實多一點,但是對于學習一些計算機系統的知識還是很有幫助的,希望這篇文章對你有所幫助,加油!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40875.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【全網最全】2024年APMCM第十四屆亞太地區大學生數學建模競賽(中文賽項)完整思路解析+代碼+論文

我是Tina表姐&#xff0c;畢業于中國人民大學&#xff0c;對數學建模的熱愛讓我在這一領域深耕多年。我的建模思路已經幫助了百余位學習者和參賽者在數學建模的道路上取得了顯著的進步和成就。現在&#xff0c;我將這份寶貴的經驗和知識凝練成一份全面的解題思路與代碼論文集合…

云計算【第一階段(26)】Linux網絡設置

一、查看網絡配置 1.查看網絡接口信息ifconfig 查看所有活動的網絡接口信息 2.ifconfig命令 查看指定網絡接口信息 ifconfig 網絡接口 &#xff08;1&#xff09;第一行&#xff1a;以太網卡的名字 ens33其中en代表以太網卡&#xff0c; centos6的是eth0&#xff0c; e…

本地maven倉庫向遠程倉庫部署jar包

使用mvn命令即可&#xff0c;如下 mvn deploy:deploy-file \ -DgroupIdtop.rdfa.auth \ -DartifactIdrdfa-auth-spring-mvc-starter \ -Dversion3.0.0-20230718-RELEASE \ -Dpackagingjar \ -Dfile/Users/panmeng/Documents/repository/top/rdfa/auth/rdf…

中國算力網絡市場發展分析

中國算力網絡市場發展現狀 算力涵蓋計算、內存、存儲等全方位能力&#xff0c;廣泛分布于網絡邊緣、云計算中心、聯網設備及轉發節點。隨著數字化技術革新&#xff0c;算力與網絡正深度融合&#xff0c;推動“算網一體化”的演進。這一新型基礎設施日漸凸顯其重要性&#xff0c…

精準畜牧業:多維傳感監測及分析動物采食行為

全球畜牧業呈現出一個動態且復雜的挑戰。近幾十年來&#xff0c;它根據對動物產品需求的演變進行了適應&#xff0c;動物生產系統需要提高其效率和環境可持續性。在不同的畜牧系統中有效行動取決于科學技術的進步&#xff0c;這允許增加照顧動物健康和福祉的數量。精準畜牧業技…

numpy庫(python)

文章目錄 1.numpy簡介2.安裝numpy3.ndarry : numpy庫的心臟3.1 創建數組3.2數據類型3.3dtype NumPy是用Python.進行科學計算&#xff0c;尤其是數據分析時&#xff0c;所用到的一個基礎庫。它是大量Python 數學和科學計算包的基礎&#xff0c;比如后面要講到的pandas)庫就用到了…

前端面試題_Css

一、說一下Css的盒子模型&#xff1f; HTML中所有元素都可以看成是一個盒子 盒子的組成&#xff1a;content、padding、border、margin 盒子的類型&#xff1a; 標準盒模型&#xff1a;marginborderpaddingcontent -- box-sizing&#xff1a;content-box&#xff08;默認&a…

Samtec汽車電子 | 汽車連接器如何在高要求、極端的環境中工作

【摘要/前言】 汽車電子&#xff0c;這些年來始終是極具流量的熱門話題&#xff0c;目前不斷發展的智能座駕、輔助駕駛等賽道都是對相關產業鏈需求的進一步刺激&#xff0c;這里蘊含著一片廣闊的市場。 同樣&#xff0c;廣闊的市場里有著極高的準入門檻和事關安全的技術挑戰。…

【AI】研發人員的《生存還是毀滅?》

AI在當前技術和社會環境下被視為一種強大的工具和輔助資源&#xff0c;而非一種取代人類開發者的替代品。在本文中&#xff0c;我們將詳細探討AI在多個領域的應用&#xff0c;如何與開發者相互作用&#xff0c;并分析AI對開發者角色的影響和未來的發展趨勢。 引言 人工智能&a…

Windows安全認證機制——Windows常見協議

一.LLMNR協議 1.LLMNR簡介 鏈路本地多播名稱解析&#xff08;LLMNR&#xff09;是一個基于域名系統&#xff08;DNS&#xff09;數據包格式的協議&#xff0c;使用此協議可以解析局域網中本地鏈路上的主機名稱。它可以很好地支持IPv4和IPv6&#xff0c;是僅次于DNS解析的名稱…

代謝組數據分析(十三):評估影響代謝物的重要臨床指標

歡迎大家關注全網生信學習者系列: WX公zhong號:生信學習者Xiao hong書:生信學習者知hu:生信學習者CDSN:生信學習者2介紹 相關性分析是通過計算兩個變量之間的相關系數來評估它們之間線性關系的強度和方向。最常用的是皮爾遜相關系數(Pearson correlation coefficient),…

security密碼明文

引言&#xff1a;在引入未給定初始化mysql數據springboot項目時&#xff0c;由于項目通過security對密碼進行了加密&#xff0c;無法進行登錄操作&#xff0c;提供的一種解決方法 1、注釋掉注入的加密類 // Autowired // private BCryptPasswordEncoder bCryptPassword…

軟件測試常見的面試題(46道)

01、您所熟悉的測試用例設計方法都有哪些&#xff1f;請分別以具體的例子來說明這些方法在測試用例設計工作中的應用。 答&#xff1a;有黑盒和白盒兩種測試種類&#xff0c;黑盒有等價類劃分法&#xff0c;邊界分析法&#xff0c;因果圖法和錯誤猜測法。白盒有邏輯覆蓋法&…

VBA通過Range對象實現Excel的數據寫入

前言 本節會介紹通過VBA中的Range對象&#xff0c;來實現Excel表格中的單元格寫入、區域范圍寫入&#xff0c;當然也可以寫入不同類型的數據&#xff0c;如數值、文本、公式&#xff0c;以及實現公式下拉自動填充的功能。 一、單元格輸入數據 1.通過Value方法實現輸入不同類型…

Windows上使用Navicat連接ubuntu上的mysql8報錯:10061和1130

問題一&#xff1a;can’t connect to mysql server on ‘192.168.xxx.xxx’(10061) 解決&#xff1a; sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf&#xff0c;bind-address綁定了登陸的IP&#xff0c;把這兩行代碼注釋掉&#xff0c;然后重啟mysql。 問題二&#xff1a;1…

利用MMDetection進行半監督目標檢測(僅供參考)

半監督目標檢測 準備和拆分數據集K則交叉驗證的解釋 完整的半監督配置文件代碼修改繼承的數據流文件代碼 多GPU訓練示范 參考 MMDetection半監督目標檢測&#xff0c;半監督目標檢測同時利用標簽數據和無標簽數據進行訓練&#xff0c;一方面可以減少模型對檢測框數量的依賴&am…

Swift 定制 Core Data 遷移

文章目錄 前言什么是 Core Data 遷移&#xff1f;示例更新模型創建一個新的模型版本創建映射模型編寫自定義遷移策略總結 前言 隨著應用程序和用戶群的增長&#xff0c;你需要添加新功能&#xff0c;刪除其他功能&#xff0c;并改變應用程序的工作方式。這是軟件開發生命周期的…

底層軟件 | 十分詳細,為了學習設備樹,我寫了5w字筆記!

0、設備樹是什么&#xff1f;1、DTS 1.1 dts簡介1.2 dts例子 2、DTC&#xff08;Device Tree Compiler&#xff09;3、DTB&#xff08;Device Tree Blob&#xff09;4、綁定&#xff08;Binding&#xff09;5、Bootloader compatible屬性 7、 #address-cells和#size-cells屬性8…

動態規劃入門,從簡單遞歸到記憶化搜索到動態規劃

動態規劃入門&#xff0c;從簡單遞歸到記憶化搜索到動態規劃 打家劫舍 class Solution {private int nums[];public int rob(int[] nums) {this.nums nums;return dfs(nums.length - 1);}public int dfs(int i){if (i < 0){return 0;}int res Math.max(dfs(i - 1), dfs(i…

127還是localhost....?

前幾天剛發現了一跨域問題&#xff0c;本來吧跨域問題也挺好解決的。 網上搜點教程&#xff0c;該怎么配置就怎么配置就完事了。 但是今天這個跨域問題有點棘手&#xff0c;問題就出在127.0.0.1還是localhost上面 先放一下一開始在127.0.0.1解決跨域的代碼 前端 HTML <…