java - sobre - Compruebe si solo se ha establecido un solo bit dentro de un entero(cualquiera que sea su posición)
manual de programacion android pdf (6)
Guardo banderas usando bits dentro de un entero de 64 bits.
Quiero saber si hay un solo bit configurado cualquiera sea la posición dentro del entero de 64 bits (ei no me importa la posición de ningún bit específico).
boolean isOneSingleBitSet (long integer64)
{
return ....;
}
Pude contar la cantidad de bits usando Bit Twiddling Hacks (por Sean Eron Anderson) , pero me pregunto cuál es la forma más eficiente de detectar si un solo bit está configurado ...
Encontré algunas otras preguntas relacionadas:
- (8051) Compruebe si se ha establecido un solo bit
- Detectando flujos únicos de un bit dentro de un entero
y también algunas páginas de Wikipedia:
Nota: mi aplicación está en Java, pero tengo curiosidad acerca de las optimizaciones usando otros lenguajes ...
EDITAR : Lưu Vĩnh Phúc señaló que mi primer enlace dentro de mi pregunta ya obtuvo la respuesta: ver la sección Determinando si un entero es una potencia de 2 en los Bit Twiddling Hacks (por Sean Eron Anderson). No me di cuenta de que un solo bit era igual a la potencia de dos .
(usando x como argumento)
Detectar si se ha configurado al menos un bit es fácil:
return x!=0;
Del mismo modo, detectar si el bit uno (segundo bit más bajo) está configurado es fácil:
return (x&2)!=0;
Exactamente un bit se establece si es una potencia de dos. Esto funciona:
return x!=0 && (x & (x-1))==0;
La clase contenedora java.lang.Long
tiene una función estática bitCount()
que devuelve el número de bits en un largo (int de 64 bits):
boolean isSingleBitSet(long l)
{
return Long.bitCount(l) == 1;
}
Tenga en cuenta que los enteros son de 32 bits en Java.
Parece que puede hacer un trabajo a nivel Y con una representación long
del bit único que desea verificar. Por ejemplo, para verificar el LSB
return( (integer64 & 1L)!=0 );
O para verificar el cuarto bit de la derecha
return( (integer64 & 8L)!=0 );
Si simplemente quiere verificar literalmente si se ha establecido un solo bit, entonces básicamente está comprobando si el número es una potencia de 2. Para hacer esto, puede hacer:
if ((number & (number-1)) == 0) ...
Esto también contará 0 como una potencia de 2, por lo que debes verificar que el número no sea 0 si eso es importante. Por lo que entonces:
if (number != 0 && (number & (number-1)) == 0) ...
Suponiendo que ya tiene una implementación eficiente - o hardware - de ffs()
- encuentre el primer conjunto - puede actuar de la siguiente manera:
bool isOneSingleBitSet (long integer64)
{
return (integer64 >> ffs(integer64)) == 0;
}
La función ffs()
puede estar ya disponible, o puede que desee ver su propio enlace arriba
supongamos que X es un intervalo de 64 bits lleno de 0 excepto el que está buscando;
return ((64bitinteger&X)==X)