[英]C: Extracting a specific set of bits? Need help explaining a particular example
題:
設備連接到計算機,該計算機可以返回與天氣有關的各種溫度。 GetTemps函數以20-29位為單位返回每日高溫,以10-19位為單位返回每日低溫,以0-9位為單位返回當前溫度,均為10位整數。 在下面的程序片段中,第8和9行不完整。 他們應該將高溫存儲在highTemp中,將當前溫度存儲在currTemp中,以便可以在第10行中打印這些溫度。請完成第8行和第9行,並有效地實現代碼
#include <stdio.h>
// Line 1
// Line 2
int GetTemps(void);
// Line 3
// Line 4
int main( ) {
// Line 5
int w, highTemp, currTemp;
// Line 6
w = getTemps( );
// Line 7
highTemp = <QUESTION 1>
// Line 8
currTemp = <QUESTION 2>
// Line 9
printf ( "High: %d\nCurrent: %d\n", highTemp, currTemp)
// Line 10
return 0;
}
答案是
highTemp = w>>20
currtemp = w<<20
正確的右移(對於highTemp)和位掩碼(對於lowTemp)操作。
如我的班TA所給
有人可以向我解釋這個答案嗎? 我想我了解w>>20
高溫程度,但是如果w
是30位的int[30...0]
那么向左推位10到0並向左推並有效地乘以它就不會移位。 2 ^ 20? 對我來說,這似乎太大了。
編輯:確切答案:
您的助教的答案是錯誤的。 這是解決問題的方法。
將多個字段打包為一個值時,最安全的方法是首先屏蔽所需的位(通過屏蔽)。 例如,假設高溫位於第20-29位,則需要一個掩碼來隔離這些位。
const int high_mask = 0x3FF00000; // 10-bit integer in bits 20-29
const int high_bits = w & high_mask; // select the bits we care about
要將其轉換為溫度,我們需要對結果進行移位,以使第20位為int位0。
const int high_temp = high_bits >> 20; // shift them "down"
但這並不完全正確! 我們尚未考慮負溫度。 算術右移將保留該值的符號,但我們對(32位整數的)高位進行了零歸零。 即使我們沒有屏蔽掉那些位,問題也不是說那些高位是什么值,因此我們不應該做假設。
解決符號的最簡單方法是先左移,使我們的最高位在最高位置。 然后,當我們右移時,處理器將進行適當的符號擴展。 假設int
是32位...
const int high_temp = (high_bits << 3) >> 23; // shift down, preserving the sign
請注意,右移值必須說明我們首先進行的左移。
(從技術上講,如果我們先轉換掉最高位,然后再轉移到最低位,那么屏蔽就不再必要了,但是從概念上講,它可以幫助理解。)
另請注意,按位運算符的優先級可能令人驚訝。 因此,如果您嘗試將這些步驟組合為一個表達式,則可能必須添加一些括號。
類似的過程可以提取當前溫度(以及更大的整數類型中嵌入的任何int值)。 您只需要調整常量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.