给定两个整数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
}
问题在于,当所有变量(包括整数的宽度)都是可变的时,我无法弄清楚如何正确制作蒙版。
有谁知道如何正确编写上述功能?
答案 0 :(得分:10)
稍微移位会给你所需的面具。
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);
}
答案 1 :(得分:1)
这个网站专门用于讨厌黑客攻击:
答案 2 :(得分:0)
您可以使用以下方式创建蒙版:
int mask_y = ((1 << len) - 1) << pos;
int mask_x = ~mask_y;
答案 3 :(得分:0)
通过取((2 ^ N + 1)-1)&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; P ??
2 ^(N + 1)给你1个位置N + 1,Suntracting 1设置所有前N个位,然后左移P次移动整个排列P位置......
由于2 ^ N等于1左移N次,所以整个事情由:
完成 ((1 << (N+1)) -1 ) << P
N和P可能会被一个关闭,但一般情况下,这应该可以正常工作