2012-09-18 8 views
14

Tengo un bitboard y quiero comprobar en C si sólo hay un bit puesto a 1.Prueba si un bitboard haber sólo un bit puesto a 1

#include <stdint.h> 
typedef uint64_t bboard; 
bboard b = 0x0000000000000010; 
if (only_one_bit_set_to_one (b)) // in this example expected true 
    // do something... 

Cualquier idea de escribir la función int only_one_bit_set_to_one (bboard b)?

+0

posible duplicado de [Cómo comprobar si un número es una potencia de 2] (http://stackoverflow.com/questions/600293/how-to-check-if-a-number-is-a-power- of-2) –

+0

Posible duplicado de [Comprobar si solo se ha establecido un solo bit dentro de un entero (cualquiera que sea su posición)] (http://stackoverflow.com/questions/13420241/check-if-only-one-single-bit -is-set-within-a-integer-whatever-its-position) –

Respuesta

38

Claro, es fácil:

int only_one_bit_set_to_one (bboard b) 
{ 
    return b && !(b & (b-1)); 
} 

Say b ha establecido ningún bit, el menos significativo es el bit número k. Entonces b-1 tiene los mismos bits que b para los índices por encima de k, 0 bits en el lugar k y 1 bit en los lugares menos significativos, por lo que el bit y elimina el bit menos significativo del b. Si b tenía solo un bit configurado, el resultado es 0, si b tenía más bits configurados, el resultado es distinto de cero.

+2

ah, el viejo "es el poder de dos" algoritmo –

+0

¡Muchas gracias! y ¿puedes decirme cómo probar si los 1 bits están en posiciones impares o pares? – Pioz

+1

XOR con una máscara que consiste en decir todas las posiciones de bits impares establecidas en 1, seguidas por una AND con la misma máscara, si el resultado es igual a la máscara, el bit NO estaba en una posición impar (creo) ... –

2

Esto puede ser un poco ingenuo, pero me gustaría bucle de 0 a 63, desactive el bit correspondiente, y ver si el resultado es 0:

if (b != 0) { 
    for (i = 0; i < 64; ++i) { 
     if (b & ~(1 << i)) == 0) { 
      return 1; 
     } 
    } 
    return 0; 
} 

es ni mucho menos tan inteligente como el otro publicado respuestas, pero tiene la ventaja de ser fácil de entender.

Cuestiones relacionadas