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

例如,我有

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


如何将6个LSB位从变量dec2复制到dec

完成此操作后,我需要将接下来的4位从dec2克隆到dec,但是要从第二个字节开始? (从第9个最低有效位起)(dec就像一个“掩码”)。

所需的行为是:

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........


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

关于c - 在C上按位操作按范围克隆位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47855281/

10-12 16:15