我如何将位的范围从一个变量克隆到另一个变量?
例如,我有
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/