如何将面具咬成数字

问题描述 投票:0回答:1

如何更改无符号字节(或更大)中的一系列位,而不关心这些范围内的当前位是什么。

0bXXXX'XXXX

我想将位置 2,3,4 处的位设置为 0b101,所以最后字节应该变成:

0bXXXX'101X

我认为 2,3 和 4 位的掩码将是 0b0000'1110 或 12

我尝试过:

unsigned char b = 255;
b = 0b101 &  ~( 12 << 1);

但是这会打印:

0000'0101
c bit-manipulation
1个回答
0
投票

清除位:

byte &= ~(0b111 << 2);

将位设置为某些数据:
byte |= 0b101 << 2;

但请注意规则#1:没有“幻数”。 0b101 是什么?为什么我们要把它移 2?因此,首先定义命名常量。如果我们正在处理的位字段被命名为“FOO”,那么例如:

#define FOO_POS    2
#define FOO_MASK   0x7u
#define FOO       (FOO_MASK << FOO_POS)

完整示例(C23):

#include <stdio.h>

#define FOO_POS    2
#define FOO_MASK   0x7u
#define FOO       (FOO_MASK << FOO_POS)

int main(void) 
{
  unsigned int bar = 0xFF;
  printf("%.2X %.8b\n", bar, bar);

  bar &= ~FOO;
  printf("%.2X %.8b\n", bar, bar);

  bar |= ((0b101 & FOO_MASK) << FOO_POS);
  printf("%.2X %.8b\n", bar, bar);
}

只是不要把这样的宏搞得太过分,并开始发明一些丑陋的 setter/getter 宏语言来设置位。 C 程序员应该了解按位运算,因此无需将它们隐藏在丑陋的宏后面,因为当显式键入时它们已经是最清晰的。

© www.soinside.com 2019 - 2024. All rights reserved.