通过两个二进制数字,将一个子集从一个复制到另一个

jab*_*jab 3 c c++ binary bit-manipulation

比方说,我有两个二进制数0011001011101110,我想最后的4个值从第二复制到第一,形成一个二进制数00111110.在两个字节(或更大的数据类型)上使用按位运算是否有干净的方法.假设二进制打包数据类型.

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

qap*_*hla 6

如果你有投入xy,并希望一组特定的位由复制xy,说,那是位1S IN一些变量m(一个面膜你要复制的位),如下这是可以做到:

int copy(int x, int y, int m) {
    return ((x & m) | (y & (~m)));
}
Run Code Online (Sandbox Code Playgroud)

这也适用于大于或小于ints的东西,例如chars,shorts,longs等.

服用(x & m)只会给在比特x用于其m具有1在该位置,并 (y & (~m))只将给予在比特y针对m不具备1在该位置.

然后将这些或运算一起|给其在该位置位值m有一个1来自x,并且其在该位置位m有一个0来自y.

你的具体情况会有x = 0xee,y = 0x32m = 0xF.

  • 变量`m`被称为`mask`. (2认同)