我如何克隆从一个变量到另一个变量的位范围?
例如,我有
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
答案 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........
这里我使用点.
来表示零位。