给定两个整数X和Y,我想将位置P的位覆盖到P + N。

例:

int x      = 0xAAAA; // 0b1010101010101010
int y      = 0x0C30; // 0b0000110000110000
int result = 0xAC3A; // 0b1010110000111010

这个程序有名字吗?

如果我有口罩,操作就很容易:
int mask_x =  0xF00F; // 0b1111000000001111
int mask_y =  0x0FF0; // 0b0000111111110000
int result = (x & mask_x) | (y & mask_y);

我还不太清楚如何以一种通用的方式编写它,例如下面的通用C++函数:
template<typename IntType>
IntType OverwriteBits(IntType dst, IntType src, int pos, int len) {
// If:
// dst    = 0xAAAA; // 0b1010101010101010
// src    = 0x0C30; // 0b0000110000110000
// pos    = 4                       ^
// len    = 8                ^-------
// Then:
// result = 0xAC3A; // 0b1010110000111010
}

问题是当所有变量(包括整数的宽度)都是变量时,我无法弄清楚如何正确制作 mask 。

有谁知道如何正确编写上述功能?

最佳答案

稍微移动一下即可为您提供所需的口罩。

template<typename IntType>
IntType OverwriteBits(IntType dst, IntType src, int pos, int len) {
    IntType mask = (((IntType)1 << len) - 1) << pos;
    return (dst & ~mask) | (src & mask);
}

08-15 22:16