簡體   English   中英

無法理解如何設置位

[英]Trouble Understanding How to Set Bits

對於我的系統 class 中的分配,我們正在學習位操作的工作原理,但我無法將其實現到此 function 中:

void setting_bits(int value, int pos, int n) {
    int n_val = value;
    
    printf("\nsetting_bits(0x%X, %i, %i) -> ",value,pos,n);
    
    int mask = 1;
    mask = (mask << n)-pos-1;
    n_val = n_val & ~mask;
    printf("0x%X",n_val);
    printf("\n");
}

這是一個示例輸入 output:

setting_bits(0xA1B2C3D4, 1, 4) -> 0xA1B2C3DE

我只是不明白如何 go 關於邏輯。 我想我了解如何修改位以及掩碼如何工作等基礎知識,但我不確定如何將它們放在一起。 我的 class 論壇沒有被證明是有用的,我的教授也沒有回復電子郵件,所以我在這里是萬不得已的。 任何回應將不勝感激。 我不想最終討厭我職業生涯中的 rest 的十六進制。

這是 function 的重寫:

void setting_bits(unsigned value, int pos, int n) {
    printf("\nsetting_bits(0x%X, %i, %i) -> ",value,pos,n);

    unsigned n_val = value | ((1u << n) - 1) << pos;
    
    printf("0x%X\n", n_val);
}

...設置從位 position pos開始的n個連續位的value並顯示結果。

這里的關鍵部分是value | ((1u << n) - 1) << pos value | ((1u << n) - 1) << pos

(1u << n)讓我們設置一個位,后跟n零位。 然后我們從中減去 1,這給了我們n設置位。 然后我們將所有左邊的內容移到正確的pos中。 最后,我們將它與為我們提供價值的舊值進行按位或,但如果它們尚未設置,則將所有這些位設置為。

使用 8 位二進制的示例, value 0101 0101, n為 3, pos為 2:

(1u << n)                       -->   00000001b << 3        --> 00001000b
((1u << n) - 1)                 -->   00001000b - 1         --> 00000111b
((1u << n) - 1) << pos          -->   00000111b << 2        --> 00011100b
value | ((1u << n) - 1) << pos  -->   01010101b | 00011100b --> 01011101b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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