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.

¿Existe una forma rápida de obtener el índice de un bit igual a 1 en un valor binario?

Quiero obtener el índice que sea igual a 1 en formato binario, actualmente uso códigos como este:

inline static uint8_t the_index(uint32_t val){
return uint8_t(log(val & ((~val) + 1))/log(2));
}

¿Hay otras formas de lograr el mismo objetivo? ¿Es posible utilizar operaciones de bits para resolver este problema?

Hago esto para iterar un valor y construir algunas operaciones que dependen de la posición iterada, los códigos pesudo son como este:

while (temp) {
auto cur_index = the_index(temp);
auto window = ((1 << i) – 1) << cur_index;
if (((temp & window) ^ window) == 0) {
//….hacer algo
}
temp &= temp – 1;
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existen otras formas de lograr el mismo resultado. Una posible manera de utilizar operaciones bit a bit es usar el operador “AND bit a bit” con una máscara de bits que tenga solo un bit establecido en 1. Por ejemplo, para obtener el índice del bit menos significativo que esté establecido a 1, se puede hacer lo siguiente:

    inline static uint8_t el_indice(uint32_t val){
      return __builtin_ctz(val); // o usar _BitScanForward() en Windows
    }
    

    El código anterior utiliza una función integrada __builtin_ctz() (o _BitScanForward() en Windows) que cuenta el número de ceros al final en la representación binaria de val. El resultado es el índice del bit menos significativo que esté establecido a 1.

    Para obtener el índice del bit más significativo que esté establecido a 1, se puede hacer lo siguiente:

    inline static uint8_t el_indice(uint32_t val){
      return 31 - __builtin_clz(val); // o usar _BitScanReverse() en Windows
    }
    

    El código anterior utiliza una función integrada __builtin_clz() (o _BitScanReverse() en Windows) que cuenta el número de ceros al inicio en la representación binaria de val. El resultado es el índice del bit más significativo que esté establecido a 1.

    Ambos métodos son más rápidos que el código original que utiliza el logaritmo, porque las operaciones bit a bit suelen ser más rápidas que las operaciones de punto flotante. Además, el segundo método es más eficiente que el primero, porque evita la necesidad de invertir el valor de entrada.

Comments are closed.