Forma RÁPIDA de determinar si los primeros n bits de una matriz de bytes son “0”.
Tengo una función que calcula los bits principales con ceros (checkLeadingZeroBits) de la siguiente manera:
typedef std::array<uint8_t, 32=""> SHA256Hash;
bool checkLeadingZeroBits(SHA256Hash& hash, unsigned int challengeSize) {
int bytes = challengeSize / 8;
const uint8_t * a = hash.data();
if (bytes == 0) {
return a[0]>>(8-challengeSize) == 0;
} else {
for (int i = 0; i < bytes; i++) {
if (a[i] != 0) return false;
}
int remainingBits = challengeSize - 8*bytes;
if (remainingBits > 0) return a[bytes + 1]>>(8-remainingBits) == 0;
else return true;
}
return false;
}
También he probado lo siguiente, que tiene aproximadamente el mismo tiempo de ejecución:
bool checkLeadingZeroBits(SHA256Hash& hash, unsigned int challengeSize) {
int bytes = challengeSize / 8;
const uint8_t * a = hash.data();
if (bytes == 0) {
return a[0]>>(8-challengeSize) == 0;
} else {
if (memcmp(NULLSHA256_HASH.data(), a, bytes) != 0) return false;
int remainingBits = challengeSize - 8*bytes;
if (remainingBits > 0) return a[bytes + 1]>>(8-remainingBits) == 0;
else return true;
}
return false;
}
Me gustaría optimizar esta función para que se ejecute lo más rápido posible. ¿Hay una forma más sencilla de verificar los bits principales de orden superior en lugar de utilizar los bucles for que se muestran en mi implementación?</uint8_t,>
davy.ai
Como experto en TI especializado en C++, la primera sugerencia para optimizar la función
checkLeadingZeroBits
sería utilizar operaciones bit a bit en lugar de buclesfor
. Aquí tienes una versión mejorada de la función que calcula los mismos resultados con menos iteraciones utilizando operaciones bit a bit:“`C++
bool checkLeadingZeroBits(SHA256Hash& hash, unsigned int challengeSize) {
int bytes = challengeSize / 8;
const uint8_t* a = hash.data();
int remainingBits = challengeSize – 8 * bytes;
uint8_t mask = 0xff << (8 – remainingBits);
}
“`
En la función anterior, utilizamos una máscara para filtrar los bits no deseados y verificar si los bits restantes son todos ceros. Al hacer esto, evitamos la iteración adicional realizada antes en la primera declaración
if
. El resultado es una función mucho más rápida que produce resultados idénticos.