假设我有两个二进制数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)));
}
这也适用于大于或小于ints 的事物,例如chars、shorts、longs 等。
取(x & m)将只给出在那个位置有 a的位x,并且
只给出在那个位置没有 a的位。m1(y & (~m))ym1
然后将它们与|相或得到值,其位置中的位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