![](/img/trans.png)
[英]How do you set only certain bits of a byte in C without affecting the rest?
[英]How do I set a new bit pattern in a certain position without changing the rest of the bits in C?
假設我有以下unsigned long val = 0xfedcba9876543210
並且我想將 16 個最低有效位更改為0xabcd
。 因此,原始值將更改為unsigned long val = 0xfedcba987654abcd
。 我已經有一個 function get
返回0x3210
,但我不確定如何將這部分值更改為0xabcd
。 有關更多上下文,這是我要實現的內容:
void set_pattern(unsigned long* val, int i, unsigned short new_pattern) {
// my attempt
unsigned short old_pattern = get(val, i); // ex: returns 0x3210 when i = 0
unsigned short* ptr = NULL;
ptr = &old_pattern;
*ptr = new_pattern;
}
當我嘗試我的嘗試時,它似乎沒有像我預期的那樣設置新模式。 感謝任何幫助或反饋,以幫助我更好地了解 C。
為了解釋Nate 的評論,您想應用位掩碼將相關位清零,然后使用按位或應用新位。
讓我們用 32 位來做,你想改變最少的 8 位。
應用位掩碼將至少 8 位變為 0。 val = val & ~0xff
。 ~0xff
是0xffffff00
。 由於0 & x = 0 ,所有填充的位將保留其值,並且所有 0 將變為 0,無論其原始值如何。
0x12345678 val
AND 0xffffff00 ~0xff
= 0x12345600
現在相關位已被屏蔽,變為 0,我們可以用按位或僅覆蓋它們。 val = val | new_value
val = val | new_value
。 x | 0 = x 。 new_value 的無關位為 0。 0 = x。 他們將保留 val 的價值。 val 的相關位為 0。 0 | x = x。 他們將保留 new_value 的值。
0x12345600 val
OR 0x000000ef new_value
= 0x123456ef
如果要替換不同的位,則需要將位掩碼和替換值移動適當的量。
假設我們想用 ef 替換 56。 每個十六進制字符為 4 位,因此我們需要將位掩碼和替換值都左移 8 位。
0x12345678 val
AND 0xffff00ff ~(0xff << 8) == ~0xff00
= 0x12340078
0x12340078 val
OR 0x0000ef00 new_value << 8 == 0xef00
= 0x1234ef78
很簡單的解決方案:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.