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