C上按位操作按范围克隆位

C上按位操作按范围克隆位,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,如何将位的范围从一个变量克隆到另一个变量 例如,我有 dec = decimal 49280, binary 11000000 10000000 dec2 = decimal 445, binary 01 10111101 如何将6个LSB位从变量dec2克隆到dec 完成此操作后,我需要将下4位从dec2克隆到dec,但要从第2个字节开始?(从第九个最低有效位开始)(dec类似于“掩码”) 期望的行为是: dec = 11000000 10000000 dec2 =

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

例如,我有

dec =  decimal 49280, binary 11000000 10000000
dec2 = decimal 445,   binary       01 10111101
如何将6个LSB位从变量
dec2
克隆到
dec

完成此操作后,我需要将下4位从
dec2
克隆到
dec
,但要从第2个字节开始?(从第九个最低有效位开始)(
dec
类似于“掩码”)

期望的行为是:

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

如果将示例位值替换为字母,则可以可视化按位操作:

dec =  abcdefghijklmnop
dec2 = ABCDEFGHIJKLMNOP
首先,从dec2中提取所需的位,并用零替换所有剩余的位:

tmp2 = dec2 & 0b0000000000111111;
tmp1 = dec & 0b1111111111000000;

first operand:  abcdefghijklmnop
second operand: 1111111111000000
result:         abcdedghij000000
这里我使用了一个前缀为
0b
的二进制文本;如果编译器不支持它,请使用等效的十六进制文字(如
0x3f

然后将目标位替换为零:

tmp2 = dec2 & 0b0000000000111111;
tmp1 = dec & 0b1111111111000000;

first operand:  abcdefghijklmnop
second operand: 1111111111000000
result:         abcdedghij000000
最后,按位或执行以下操作:

res1 = tmp1 | tmp2;

first operand:  abcdedghij000000
second operand: 0000000000KLMNOP
result:         abcdefghijKLMNOP
这是按位OR运算的一个广泛使用的属性-如果它的一个输入为零,它会将另一个复制到输出


对于第二个操作,需要按位移位。在不深入了解所需位的细节的情况下,您仍然可以对字母使用可视化技术:

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

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

temp=(dec2&0b0000111000000)“从末尾”-这是什么意思?为了避免混淆,我们通常使用名称MSB(最高有效位)和LSB(最低有效位)。此外,如果只要求执行一个“位克隆”操作,问题会更清楚。如果你知道如何做一件事,你就会知道如何做两件事。或者,如果有两个非常不同的操作,则显示第一个操作的预期结果,然后显示最终的预期结果。@anatolyg它的意思是LSB,谢谢!我什么都不懂。请用一些ascii艺术来阐述?我不把这个作为答案,因为你的问题不够准确。