Necesito trabajar con un número binario.
Traté de escribir:
const x = 00010000;
Pero no funcionó.
Sé que puedo usar un número hexadecimal que tiene el mismo valor que 00010000
, pero quiero saber si hay un tipo en C ++ para números binarios y si no lo hay, ¿hay otra solución para mi problema?
00010000
es octal, ¿verdad? (Y a su declaración le falta un tipo.)0b
solo aparece en C ++ 14). Están diseñados para ser inequívocos.Respuestas:
Puede usar
BOOST_BINARY
mientras espera C ++ 0x. :)BOOST_BINARY
posiblemente tenga una ventaja sobre la implementación de la plantilla en la medida en que también se puede usar en programas en C (es 100% controlado por un preprocesador).Para hacerlo a la inversa (es decir, imprimir un número en formato binario), se puede utilizar la no portátil
itoa
función , o implementar su propio .Desafortunadamente, no puede formatear en base 2 con secuencias STL (ya
setbase
que solo honrará las bases 8, 10 y 16), pero puede usar unastd::string
versión deitoa
(o la más concisa, pero marginalmente menos eficiente)std::bitset
.produce:
También lea The String Formatters de Manor Farm de Herb Sutter para una discusión interesante.
fuente
int main() { cout << bitset<8>(42); }
bitset
consejo, ya corrigí un pocosetbase
antes de ver tu comentario.Si está utilizando GCC, puede utilizar una extensión de GCC (que se incluye en el estándar C ++ 14 ) para esto:
fuente
Puedes usar literales binarios. Están estandarizados en C ++ 14. Por ejemplo,
Apoyo en CCG
El soporte en GCC comenzó en GCC 4.3 (consulte https://gcc.gnu.org/gcc-4.3/changes.html ) como extensiones de la familia del lenguaje C (consulte https://gcc.gnu.org/onlinedocs/gcc/ C-Extensions.html # C-Extensions ), pero desde GCC 4.9 ahora se reconoce como una característica de C ++ 14 o una extensión (consulte ¿ Diferencia entre literales binarios de GCC y C ++ 14? )
Soporte en Visual Studio
El soporte en Visual Studio comenzó en Visual Studio 2015 Preview (consulte https://www.visualstudio.com/news/vs2015-preview-vs#C++ ).
fuente
El dígito más a la izquierda del literal todavía tiene que ser 1, pero no obstante.
fuente
binary<10>::value == binary<010>::value
y algunas comprobaciones de errores)Algunos compiladores (generalmente los de microcontroladores ) tienen una característica especial implementada dentro del reconocimiento de números binarios literales con el prefijo "0b ..." que precede al número, aunque la mayoría de los compiladores (estándares C / C ++) no tienen esa característica y si es el caso, aquí está mi solución alternativa:
Desventajas (no es tan grande):
Ventajas :
spending processor time
en operaciones sin sentido (like "?.. :..", "<<", "+"
) al programa ejecutable (se puede realizar cientos de veces en la aplicación final);"mainly in C"
compiladores y C ++ también (template+enum solution works only in C++ compilers
);"enum solution" (usually 255 = reach enum definition limit)
, de manera diferente, las limitaciones "constantes literales", en el compilador permite números mayores;several header files
(en la mayoría de los casos no son fácilmente legibles y comprensibles, y hacen que el proyecto se confunda y extienda innecesariamente, por ejemplo"BOOST_BINARY()"
);fuente
B_0100
no se usa (en lugar de0100
)? Como en egchar b = BYTE(0100,0001);
._B2H
función de preprocesador agrega B_ .Este hilo puede ayudar.
¡Funciona! (Todos los créditos van a Tom Torfs).
fuente
##
operador del preprocesador pega los tokens juntos. Entonces, en este caso, si llamasHEX__(10)
, se expande a0x10LU
.Como ya se respondió, los estándares C no tienen forma de escribir directamente números binarios. Sin embargo, hay extensiones del compilador, y aparentemente C ++ 14 incluye el
0b
prefijo para binario. (Tenga en cuenta que esta respuesta se publicó originalmente en 2010.)Una solución popular es incluir un archivo de encabezado con macros auxiliares . Una opción fácil también es generar un archivo que incluya definiciones de macro para todos los patrones de 8 bits, por ejemplo:
Esto da como resultado solo 256
#define
s, y si se necesitan constantes binarias de más de 8 bits, estas definiciones se pueden combinar con desplazamientos y OR, posiblemente con macros auxiliares (por ejemplo,BIN16(B00000001,B00001010)
). (Tener macros individuales para cada valor de 16 bits, y mucho menos de 32 bits, no es plausible).Por supuesto, la desventaja es que esta sintaxis requiere escribir todos los ceros a la izquierda, pero esto también puede aclararlo para usos como establecer banderas de bits y contenido de registros de hardware. Para una macro similar a una función que resulta en una sintaxis sin esta propiedad, vea el
bithacks.h
enlace anterior.fuente
long long int
?La mentalidad de sobre ingeniería de C ++ ya está bien explicada en las otras respuestas aquí. Aquí está mi intento de hacerlo con una mentalidad C, keep-it-simple-ffs:
fuente
C no tiene notación nativa para números binarios puros. Su mejor apuesta aquí sería octal (p
07777
. Ej. ) De hexadecimal (p0xfff
. Ej .).fuente
Puede usar la función que se encuentra en esta pregunta para obtener hasta 22 bits en C ++. Aquí está el código del enlace, editado adecuadamente:
Entonces puedes hacer algo como
binary<0101011011>::value
.fuente
La unidad más pequeña con la que puede trabajar es un byte (que es de
char
tipo). Sin embargo, puede trabajar con bits utilizando operadores bit a bit.En cuanto a los literales enteros, solo puede trabajar con números decimales (base 10), octales (base 8) o hexadecimales (base 16). No hay literales binarios (base 2) en C ni C ++.
Los números octales tienen el prefijo
0
y los números hexadecimales tienen el prefijo0x
. Los números decimales no tienen prefijo.En C ++ 0x podrás hacer lo que quieras a través de literales definidos por el usuario .
fuente
<shameless_plug>
stackoverflow.com/questions/2611764#2611883</shameless_plug>
0b00101010
como una conveniencia. SDCC es uno, y estoy seguro de que hay otros que también lo hacen. (Editar: Ja, ¡golpéame, @Joey!)También puede usar un ensamblaje en línea como este:
De acuerdo, puede ser algo exagerado, pero funciona.
fuente
Basado en algunas otras respuestas, pero esta rechazará programas con literales binarios ilegales. Los ceros iniciales son opcionales.
Ejemplo:
fuente
El "tipo" de un número binario es el mismo que cualquier número decimal, hexadecimal u octal:
int
(o incluso char, short, long long).Cuando asigna una constante, no puede asignarla con 11011011 (curiosa y desafortunadamente), pero puede usar hexadecimal. El maleficio es un poco más fácil de traducir mentalmente. Trocear en nibbles (4 bits) y traducir a un carácter en [0-9a-f].
fuente
Puedes usar un bitset
fuente
Extendí la buena respuesta dada por @ renato-chandelier asegurando el apoyo de:
_NIBBLE_(…)
- 4 bits, 1 mordisco como argumento_BYTE_(…)
- 8 bits, 2 mordiscos como argumentos_SLAB_(…)
- 12 bits, 3 mordiscos como argumentos_WORD_(…)
- 16 bits, 4 mordiscos como argumentos_QUINTIBBLE_(…)
- 20 bits, 5 mordiscos como argumentos_DSLAB_(…)
- 24 bits, 6 mordiscos como argumentos_SEPTIBBLE_(…)
- 28 bits, 7 mordiscos como argumentos_DWORD_(…)
- 32 bits, 8 mordiscos como argumentosEn realidad, no estoy tan seguro acerca de los términos "quintibble" y "septibble". Si alguien conoce alguna alternativa, hágamelo saber.
Aquí está la macro reescrita:
Y aquí está el ejemplo de Renato:
fuente
Simplemente use la biblioteca estándar en C ++:
Necesita una variable de tipo
std::bitset
:En este ejemplo, almacené la forma binaria de
10
inx
.8ul
define el tamaño de sus bits, por lo que7ul
significa siete bits y así sucesivamente.fuente
C ++ proporciona una plantilla estándar llamada
std::bitset
. Pruébalo si quieres.fuente
Podría intentar usar una matriz de
bool
:fuente