int a = 12;por ejemplo: el binario de 12 es 1100, por lo que la respuesta debe ser 3 ya que se establece el tercer bit desde la derecha.
Quiero la posición del último bit más establecido de a archivo . ¿Alguien puede decirme cómo puedo hacerlo?
NOTA : solo quiero posición, aquí no quiero configurar o restablecer el bit. Por lo tanto, no es un duplicado de ninguna pregunta sobre stackoverflow.
Esta respuesta Unset the rightmost set bit indica cómo obtener y desactivar el bit más a la derecha para un entero sin signo o un entero con signo representado como complemento a dos .
obtener el bit más a la derecha ,
x & -x // or x & (~x + 1)desarmar el bit establecido más a la derecha ,
x &= x - 1 // or x -= x & -x // rhs is rightmost set bitpor qué funciona
x: leading bits 1 all 0 ~x: reversed leading bits 0 all 1 ~x + 1 or -x: reversed leading bits 1 all 0 x & -x: all 0 1 all 0 por ejemplo, sea x = 112 y elija 8 bits por simplicidad, aunque la idea es la misma para todos los tamaños de enteros.
// example for get rightmost set bit x: 01110000 ~x: 10001111 -x or ~x + 1: 10010000 x & -x: 00010000 // example for unset rightmost set bit x: 01110000 x-1: 01101111 x & (x-1): 01100000Encontrar el índice (basado en 0) del bit establecido menos significativo es equivalente a contar cuántos ceros finales tiene un entero dado. Dependiendo de su compilador, hay funciones integradas para esto, por ejemplo, gcc y clang admiten __builtin_ctz . Para MSVC, necesitaría implementar su propia versión, esta respuesta a una pregunta diferente muestra una solución que utiliza los intrínsecos de MSVC.
Dado que está buscando el índice basado en 1, simplemente necesita agregar 1 al resultado de ctz para lograr lo que desea.
int a = 12; int least_bit = __builtin_ctz(a) + 1; // least_bit = 3 Tenga en cuenta que esta operación no está definida si a == 0 . Además, existen __builtin_ctzl y __builtin_ctzll que debe usar si está trabajando con long y long long en lugar de int .
Uno puede usar la propiedad del complemento a 2 aquí.
La forma más rápida de encontrar el complemento a 2 de un número es obtener el bit establecido más a la derecha y voltear todo a la izquierda.
por ejemplo: considere un sistema de 4 bits
4=0100
2s complemento de 4 = 1100, que nada más que -4
4&(-4)=0100.
Tenga en cuenta que solo hay un bit establecido y está en el bit establecido más a la derecha de 4
Del mismo modo, podemos generalizar esto para n.
n&(-n) contendrá solo un bit establecido que en realidad está en la posición del bit establecido más a la derecha de n.
dado que solo hay un bit establecido en n&(-n), es una potencia de 2.
Así que finalmente podemos obtener la posición del bit de la siguiente manera: