es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  ,

Answer

  1. Avatar for 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 bucles for. 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);

    for (int i = 0; i < bytes; i++) {
        if (a[i] != 0) return false;
    }
    if (remainingBits > 0) return (a[bytes] & mask) == 0;
    else return true;
    

    }
    “`

    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.

Comments are closed.