Escritura del sistema numérico binario en código C

Como usamos el prefijo 0x para los números hexadecimales y 0 para los octatales, ¿hay algo que se pueda hacer para los números binarios?

Intenté el sufijo b , pero el GCC no lo permitió.

Error: sufijo inválido “b” en la constante entera

¿Es posible?

El estándar C no define constantes binarias. Aunque hay una extensión de GNU (creo) (entre los comstackdores populares, clang también lo adapta): el prefijo 0b :

 int foo = 0b1010; 

Si desea seguir con la norma C, existe una opción: puede combinar una macro y una función para crear una función de “constante binaria” casi legible:

 #define B(x) S_to_binary_(#x) static inline unsigned long long S_to_binary_(const char *s) { unsigned long long i = 0; while (*s) { i <<= 1; i += *s++ - '0'; } return i; } 

Y luego puedes usarlo así:

 int foo = B(1010); 

Si activa las optimizaciones pesadas del comstackdor, lo más probable es que el comstackdor elimine por completo la llamada a la función (plegado constante) o al menos lo alinee, por lo que esto ni siquiera será un problema de rendimiento.

Prueba:

El siguiente código:

 #include  #include  #include  #include  #define B(x) S_to_binary_(#x) static inline unsigned long long S_to_binary_(const char *s) { unsigned long long i = 0; while (*s) { i <<= 1; i += *s++ - '0'; } return i; } int main() { int foo = B(001100101); printf("%d\n", foo); return 0; } 

ha sido comstackdo usando clang -o baz.S baz.c -Wall -O3 -S , y produjo el siguiente ensamblado:

  .section __TEXT,__text,regular,pure_instructions .globl _main .align 4, 0x90 _main: ## @main .cfi_startproc ## BB#0: pushq %rbp Ltmp2: .cfi_def_cfa_offset 16 Ltmp3: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp4: .cfi_def_cfa_register %rbp leaq L_.str1(%rip), %rdi movl $101, %esi ## <= This line! xorb %al, %al callq _printf xorl %eax, %eax popq %rbp ret .cfi_endproc .section __TEXT,__cstring,cstring_literals L_.str1: ## @.str1 .asciz "%d\n" .subsections_via_symbols 

Así que clang eliminó completamente la llamada a la función y reemplazó su valor de retorno con 101 . Limpio, ¿eh?

Prefijo usted literal con 0b como en

 int i = 0b11111111; 

Mira aquí .

Use BOOST_BINARY (Sí, puede usarlo en C).

 #include  ... int bin = BOOST_BINARY(110101); 

Esta macro se expande a un literal octal durante el preprocesamiento.