假设我有两个二进制数00110010
和11101110
,我想将最后 4 个值从第二个复制到第一个以形成一个二进制数00111110
。是否有干净的方法可以使用两个字节(或更大的数据类型)的按位运算来做到这一点。假设二进制打包数据类型。
此外,是否存在可以复制任何子集的通用解决方案。假设我想将一些中间 3 位从一个数字复制到另一个数字,实现此目的的最佳方法是什么?
假设我有两个二进制数00110010
和11101110
,我想将最后 4 个值从第二个复制到第一个以形成一个二进制数00111110
。是否有干净的方法可以使用两个字节(或更大的数据类型)的按位运算来做到这一点。假设二进制打包数据类型。
此外,是否存在可以复制任何子集的通用解决方案。假设我想将一些中间 3 位从一个数字复制到另一个数字,实现此目的的最佳方法是什么?
如果您有输入x
并且y
想要将一组特定的位从 复制x
到y
,例如,1
某个变量中的位(您要复制的位m
的掩码),可以按如下方式完成:
int copy(int x, int y, int m) {
return ((x & m) | (y & (~m)));
}
这也适用于大于或小于int
s 的事物,例如char
s、short
s、long
s 等。
取(x & m)
将只给出在那个位置有 a的位x
,并且
只给出在那个位置没有 a的位。m
1
(y & (~m))
y
m
1
然后将它们与|
相或得到值,其位置中的位m
具有 a1
来自x
,以及其位置中的位m
具有 a0
来自y
。
您的特定情况将有x = 0xee
,y = 0x32
和m = 0xF
.
你可以试试这个
#include "stdio.h"
int main()
{
int a = 0x52;
int b = 0xee;
int c = (a&0xF0)|(b&0x0F);
printf(" %x %d\n", c, c);
}
a 是00110010
, b 是11101110