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

时间:2017-12-17 12:52:17

标签: c bit-manipulation bitwise-operators

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

例如,我有

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

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

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

理想的行为是:

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

1 个答案:

答案 0 :(得分: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

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

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

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

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

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