3

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

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

4

2 回答 2

6

如果您有输入x并且y想要将一组特定的位从 复制xy,例如,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 = 0x32m = 0xF.

于 2013-09-30T17:07:23.617 回答
1

你可以试试这个

#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

于 2013-09-30T17:14:10.623 回答