繁体   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