Dado dos enteros X e Y, quiero sobreescribir los bits en la posición P a P + N.Sobrescribir un rango de bits en un entero de forma genérica
Ejemplo:
int x = 0xAAAA; // 0b1010101010101010
int y = 0x0C30; // 0b0000110000110000
int result = 0xAC3A; // 0b1010110000111010
¿Este procedimiento tiene un nombre?
Si tengo máscaras, la operación es bastante fácil:
int mask_x = 0xF00F; // 0b1111000000001111
int mask_y = 0x0FF0; // 0b0000111111110000
int result = (x & mask_x) | (y & mask_y);
Lo que no acabo de entender es la forma de escribir de una manera genérica, como en la siguiente función genérica de 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
}
El problema es que no puedo entender cómo hacer las máscaras correctamente cuando todas las variables, incluido el ancho del entero, son variables.
¿Alguien sabe cómo escribir la función anterior correctamente?
¿Necesita esto un caso especial para cuando está enmascarando toda la cuerda? Como en ese caso, 1 << len se desbordará. –
Realmente se desbordará, pero dará la respuesta correcta. –