![](/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.