簡體   English   中英

如何在某個 position 中設置新的位模式而不更改 C 中位的 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 ~0xff0xffffff00 由於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

很簡單的解決方案:

  1. 0xfedcba9876543210 & 0xfedcba9876540000
  2. 0xfedcba9876540000 | 0x000000000000abcd

暫無
暫無

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

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