通过 C 上的按位操作按范围克隆位
Clone bits by range by bitwise ops on C
如何将位范围从一个变量克隆到另一个变量?
例如,我有
dec = decimal 49280, binary 11000000 10000000
dec2 = decimal 445, binary 01 10111101
如何从变量 dec2
克隆 6 LSB 位到 dec
?
完成此操作后,我需要克隆从 dec2
到 dec
的下 4 位,但在第二个字节的开头? (从第 9 个最低有效位开始)(dec
就像 "mask")。
期望的行为是:
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........
这里我用了一个点.
来表示一个零位
如何将位范围从一个变量克隆到另一个变量?
例如,我有
dec = decimal 49280, binary 11000000 10000000
dec2 = decimal 445, binary 01 10111101
如何从变量 dec2
克隆 6 LSB 位到 dec
?
完成此操作后,我需要克隆从 dec2
到 dec
的下 4 位,但在第二个字节的开头? (从第 9 个最低有效位开始)(dec
就像 "mask")。
期望的行为是:
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........
这里我用了一个点.
来表示一个零位