按C上的按位运算按范围克隆位

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

我如何克隆从一个变量到另一个变量的位数?

例如,我有

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

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

在这个操作之后,我需要将dec2的下一个4位克隆到dec但是在第二个字节的开头? (从第9个最低位)(dec就像一个“面具”)。

期望的行为是:

dec =  11000000 10000000
dec2 =       01 10111101
res1 = 11000000 10111101
res2 = 11000110 10111101
c bit-manipulation bitwise-operators
1个回答
1
投票

如果用字母替换示例位值,则可以显示按位操作:

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

最后,做一个按位OR:

res1 = tmp1 | tmp2;

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

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


对于第二次操作,您需要按位移位。如果不了解所需位数的详细信息,您仍然可以使用可视化技术和字母:

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

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

在这里,我使用点.来表示零位。

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