通过 C 上的按位操作按范围克隆位

Clone bits by range by bitwise ops on C

如何将位范围从一个变量克隆到另一个变量?

例如,我有

dec =  decimal 49280, binary 11000000 10000000
dec2 = decimal 445,   binary       01 10111101

如何从变量 dec2 克隆 6 LSB 位到 dec

完成此操作后,我需要克隆从 dec2dec 的下 4 位,但在第二个字节的开头? (从第 9 个最低有效位开始)(dec 就像 "mask")。

期望的行为是:

dec =  11000000 10000000
dec2 =       01 10111101
res1 = 11000000 10111101
res2 = 11000110 10111101

如果用字母替换示例位值,您可以可视化位运算:

dec =  abcdefghijklmnop
dec2 = ABCDEFGHIJKLMNOP

首先,从 dec2 中提取需要的位,并将其余所有替换为零:

tmp2 = dec2 & 0b0000000000111111;

这里我使用的是带有 0b 前缀的二进制文字;如果您的编译器不支持它,请使用等效的十六进制文字(如 0x3f)。

first operand:  ABCDEFGHIJKLMNOP
second operand: 0000000000111111
result:         0000000000KLMNOP

然后用零替换目标位:

tmp1 = dec & 0b1111111111000000;

first operand:  abcdefghijklmnop
second operand: 1111111111000000
result:         abcdedghij000000

最后,做一个按位或:

res1 = tmp1 | tmp2;

first operand:  abcdedghij000000
second operand: 0000000000KLMNOP
result:         abcdefghijKLMNOP

这是一种广泛使用的 属性 按位或运算 - 如果其中一个输入为零,它将另一个复制到输出。


对于你的第二个操作,你需要一个位移位。无需详细了解您需要哪些位,您仍然可以使用带有字母的可视化技术:

temp = (dec2 & 0b0000001111000000) << 2;

dec2 =             ABCDEFGHIJKLMNOP
second operand:    ......1111......
after bitwise AND: ......GHIJ......
after shift left:  ....GHIJ........

这里我用了一个点.来表示一个零位