How do you set only certain bits of a byte in C without affecting the rest?
假设我有一个像 1010XXXX 这样的字节,其中 X 值可以是任何值。我想将低四位设置为特定模式,比如 1100,而高四位不受影响。我如何在 C 语言中以最快的速度做到这一点?
一般来说:
1
|
value = (value & ~mask) | (newvalue & mask);
|
mask 是一个值,所有要更改的位(并且只有它们)设置为 1 – 在您的情况下它将是 0xf 。 newvalue 是一个包含这些位的新状态的值 – 所有其他位基本上都被忽略了。
这适用于支持位运算符的所有类型。
- 你能举一个具体的例子吗?假设我有:n = 1024。我想将位置 3 到 7(包括,从 0 和最低有效位开始)的位更改为 k = 19。结果应该是:1176。我该如何实现呢?谢谢你。
- 刚刚自己解决了这个问题,我想出了以下宏来概括这个问题。 (不知道为什么代码格式化不起作用,抱歉)“` #define MASK(L,P) (~(0xffffffff << (L)) << (P)) #define GET_VAL(BF,L,P) (( (高炉)
您可以通过按位与设置将所有这些位设置为 0,其中 4 位设置为 0,所有其他位设置为 1(这是设置为 1 的 4 位的补码)。然后,您可以像往常一样按位或按位进行操作。
即
1
2 3 |
val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no // other bits are set. |
- 为什么?0xf等于0x0000000f(四个字节),为什么不是3个字节或5个字节?编译器是否根据要进行 ANDED 的 sizeof val 决定长度 4?
- @doc_id:我假设 val 是一个 32 位整数。它可能是 16 位或 64 位,但不太可能是 24 或 40 位,因为它们不是标准整数类型……
n
使用按位运算符或 |当您想将字节的位从 0 更改为 1.
使用位运算符和
来源:https://www.codenong.com/4439078/