给出两个二进制数,将一个子集从一个复制到另一个

GIven two binary numbers, copy a subset from one to another

本文关键字:一个 子集 复制 另一个 两个 二进制数      更新时间:2023-10-16

假设我有两个二进制数0011001011101110,我想将最后 4 个值从第二个复制到第一个,以形成一个 00111110 的二进制数。有没有干净的方法可以在两个字节(或更大的数据类型)上使用按位运算来做到这一点。假设二进制打包的数据类型。

另外,是否有解决此问题的通用解决方案,可以复制任何子集。假设我想将一些中间的 3 位从一个数字复制到另一个数字,实现此目的的最佳方法是什么?

如果您有输入xy,并且想要将一组特定的位从x复制到y,例如,在某些变量m(要复制的位的掩码)中1 s的位,可以按如下方式完成:

int copy(int x, int y, int m) {
    return ((x & m) | (y & (~m)));
}

这也适用于大于或小于 int s 的东西,例如 char s、short s、long s 等。

(x & m)将只给出m在该位置有1x位,并且 (y & (~m))将仅给出m在该位置没有1y位。

然后将这些与|一起 OR 运算,以给出值,该值在m具有1的位置中的位来自x,而m具有0的位置中的位来自y

您的特定情况将具有 x = 0xeey = 0x32m = 0xF

你可以试试这个

#include "stdio.h"
    int main()
    {
            int a = 0x52;
            int b = 0xee;
            int c = (a&0xF0)|(b&0x0F);

            printf(" %x %dn",  c, c);
    }

A 是 00110010 , B 是 11101110