Código de máquina x86-16 (DOS), 16 bytes
B4 02 mov ah, 2
B2 30 mov dl, '0'
B9 1F 00 mov cx, 31
PrintZeros:
CD 21 int 0x21
E2 FC loop PrintZeros
00 CA add dl, bl
CD 21 int 0x21
C3 ret
La función anterior recibe un valor booleano (0 == falsey, 1 == verdad) en el BLregistro (byte bajo de BX) e imprime una cadena "booleana redundante" en la salida estándar.
Funciona invocando una interrupción (0x21) para realizar una llamada a la función de DOS (seleccionada mediante la configuración AHde 2) que imprime un solo carácter (entrada DL) en la salida estándar.
Primero, se carga el carácter ASCII '0' DL, el contador ( CX) se establece en 31 y se repite para imprimir los bytes "redundantes". Luego, el valor booleano de entrada se agrega a DL(si BLes falsey, agregar 0 dejará DLsin cambios como ASCII '0'; si BLes verdadero, DLse incrementará en uno a ASCII '1'), y se imprimirá el byte final.
La función no devuelve un valor.
Bastante decente para un lenguaje que realmente no hace cadenas.
Programa completo, 21 bytes
Si desea convertirlo en un programa completo, solo se requieren 5 bytes más. En lugar de pasar la entrada en un registro, esto lee la entrada de los argumentos pasados en la línea de comando al invocar la aplicación. Un argumento de 0 se interpreta como falsey, como lo es la falta total de argumentos; Un argumento mayor que 0 se interpreta como verdadero.
Simplemente ensamble el siguiente código como un programa COM y luego ejecútelo en la línea de comando.
B4 02 mov ah, 2
B2 30 mov dl, '0'
B9 1F 00 mov cx, 31
PrintZeros:
CD 21 int 0x21
E2 FC loop PrintZeros
3A 16 82 00 cmp dl, BYTE PTR [0x82] ; compare to 2nd arg, at offset 0x82 in PSP
D6 salc ; equivalent to sbb al, al
28 C2 sub dl, al
CD 21 int 0x21
C3 ret ; you can simply 'ret' to end a COM program
Salida de muestra:
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
¿Como funciona? Bueno, es básicamente lo mismo, hasta llegar a las CMPinstrucciones. Esto compara el argumento de la línea de comandos con el valor del DLregistro (que, recuerda, contiene un ASCII '0'). En un programa COM, los bytes de código se cargan en el desplazamiento 0x100. Precedente es el prefijo de segmento de programa (PSP) , que contiene información sobre el estado de un programa DOS. Específicamente, en el desplazamiento 0x82, se encuentra el primer argumento (en realidad el segundo, ya que el primero es un espacio) que se especificó en la línea de comando cuando se invocó el programa. Entonces, solo estamos comparando este byte con un ASCII '0'.
La comparación establece los indicadores, y luego la SALCinstrucción (un código de operación no documentado antes del Pentium, equivalente a sbb al, al, pero solo 1 byte en lugar de 2) se establece ALen 0 si los dos valores eran iguales, o -1 si eran diferentes. Es entonces evidente que cuando se resta ALde DL, esto resulta en ASCII '0' o '1', según el caso.
(Tenga en cuenta que, irónicamente, lo romperá si pasa un argumento con un 0 01inicial en la línea de comando, ya que solo se ve en el primer carácter. Por lo tanto , se tratará como falsey. :-)