簡體   English   中英

C:提取一組特定的位? 需要幫助解釋一個特定的例子

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM