int temp = 0x5E; // in binary 0b1011110.
¿Existe alguna manera de verificar si el bit 3 en temp es 1 o 0 sin desplazamiento de bits y enmascaramiento?
Solo quiero saber si hay alguna función incorporada para esto, o me veo obligado a escribir una yo mismo.
c++
c
bit-manipulation
Milán
fuente
fuente
!= 0
es cierto, entonces ¿para qué molestarse?1
es exactamente tan cierto como0.1415
!std::bitset
¿en serio? Claro, en lugar de hacer un poco de trabajo (y potencialmente algunas plantillas realmente agradables) para verificar un solo bit, use un contenedor inflado que almacene (en mi implementación) cada 'bit' en un lugar que de otro modo no se usaríaunsigned long
. ¡Qué desperdicio de espacio!Compruebe si el bit N (a partir de 0) está establecido:
No hay una función incorporada para esto.
fuente
1 << 0
? Lo siento, confundido.1<<0
, que es 1 sin ningún cambio (turno 0), que es1<<0 == 1
Solo usaría un std :: bitset si es C ++. Sencillo. Sencillo. No hay posibilidad de errores estúpidos.
o que tal esta tontería
fuente
std::bitset<CHAR_BIT * sizeof(int)>
para ser aún más correctoSí, sé que no "tengo" que hacerlo de esta manera. Pero suelo escribir:
P.ej:
Entre otras cosas, este enfoque:
Por ejemplo: #define ABS (X) (((X) <0)? - (X): (X))
ABS (i ++);
fuente
Lo que hace la respuesta seleccionada es realmente incorrecto. La siguiente función devolverá la posición del bit o 0 dependiendo de si el bit está realmente habilitado. Esto no es lo que pedía el cartel.
Esto es lo que buscaba originalmente el póster. La siguiente función devolverá un 1 o un 0 si el bit está habilitado y no la posición.
fuente
bool has_feature = CHECK_BIT(register, 25);
bueno saber que podría hacerlo sin la doble negación.Según esta descripción de los campos de bits , existe un método para definir y acceder a los campos directamente. El ejemplo de esta entrada es:
Además, hay una advertencia allí:
fuente
Puede utilizar un Bitset: http://www.cppreference.com/wiki/stl/bitset/start .
fuente
Utilice std :: bitset
fuente
temp
necesario reflejar el valor para convertirlo en "big-endian"?Existe, a saber, la instrucción intrínseca _bittest .
fuente
Yo uso esto:
donde "pos" se define como 2 ^ n (ig 1,2,4,8,16,32 ...)
Devuelve: 1 si es verdadero 0 si es falso
fuente
4 = 2^(3-1)
para la posición de bit 3, ya que era parte de la pregunta.Estaba tratando de leer un entero de 32 bits que definía las banderas para un objeto en archivos PDF y esto no me funcionaba
lo que solucionó fue cambiar la definición:
el operando y devuelve un número entero con las banderas que ambos tienen en 1, y no se estaba convirtiendo correctamente en booleano, esto funcionó
fuente
!= 0
haría lo mismo. No sé en qué pueden diferir las instrucciones de la máquina generada.Podría "simular" cambios y enmascaramiento: if ((0x5e / (2 * 2 * 2))% 2) ...
fuente
Para la solución específica x86 de bajo nivel, use el código de operación x86 TEST .
Sin embargo, su compilador debería convertir _bittest en esto ...
fuente
¿Por qué no usar algo tan simple como esto?
SALIDA: binaria:
11111111
fuente
std::cout << (((status & (1 << i)) ? '1' : '0');
. Debe usar laCHAR_BIT
constante de en<climits>
lugar de codificar 8 bits, aunque en este caso sabe que el resultado será 8 de todos modos, ya que está usando unuint8_t
si solo quieres una forma realmente codificada:
tenga en cuenta que esto depende de hw y asume este orden de bits 7654 3210 y var es de 8 bits.
Resultados en:
1 0 1 0
fuente
Si bien es bastante tarde para responder ahora, hay una manera simple de encontrar si el bit N está establecido o no, simplemente usando los operadores matemáticos POWER y MODULUS.
Digamos que queremos saber si 'temp' tiene el N-ésimo bit establecido o no. La siguiente expresión booleana dará verdadero si el bit está establecido, 0 en caso contrario.
Considere el siguiente ejemplo:
Si quiero saber si el tercer bit está configurado o no, obtengo
Entonces expresión devuelve verdadero, lo que indica que el tercer bit está establecido.
fuente
Un enfoque será verificar dentro de la siguiente condición:
Un programa de explicación será:
Salida:
fuente
pos - Posición de bit comenzando desde 0.
devuelve 0 o 1.
fuente
Yo hago esto:
LATGbits.LATG0 = ((m & 0x8)> 0); // para comprobar si el bit-2 de m es 1
fuente
la forma más rápida parece ser una tabla de búsqueda de máscaras
fuente