Un jeu binaire

GW-Basic, utilisé par PC-Basic

Programme avec Texte Seulement

PC-BASIC

Dans la section précédente (Convertisseur de base), nous avons appris à convertir des valeurs décimales en binaire et inversement; de plus, nous avons écrit un programme, appelé BASE.BAS, qui a fait ces types de conversions automatiquement.

Mais GW-BASIC peut nous aider à faire plus avec les nombres binaires, à savoir, effectuer l'algèbre booléenne sur eux. Nous avons déjà vu les mots clés AND, OR et NOT ; ils sont le plus souvent utilisés dans des instructions conditionnelles, telles que les suivantes :

IF TEMP>9 OR NUM<=12 THEN GOSUB 500

Cependant, ces trois opérations de base de l'algèbre booléenne peuvent également être appliquées directement aux nombres eux-mêmes. Par exemple, en mode direct, si vous saisissez:

PRINT 45 AND 54

la sortie sera 36. Cela peut initialement vous sembler bizarre, mais il y a une bonne explication à cela.

Si nous convertissons 45 en binaire, le résultat est 101101.

Convertissez 54 en binaire et nous obtenons 110110.

L'opérateur AND compare les bits (0 et 1) de chaque nombre, bit par bit, de gauche à droite. Le tableau ci-dessous résume le processus :

AND 0 1
0 0 0
1 0 1

Ce n'est que si les deux bits sont 1 qu'une opération ET donne un 1. Ainsi, en comparant 45 et 54, nous voyons que:

101101
110110
---------
100100

Comme prévu, 100100 converti en décimal est 36.

L'opération booléenne OU est similaire à ET, mais un peu plus "pardonnante": contrairement à ET, où les deux bits doivent être 1 pour obtenir un résultat final de 1, avec OU l'un ou l'autre des bits peut être 1 pour que l'opération aboutisse à 1 (techniquement, cela s'appelle un ou inclusif). Le tableau ci-dessous résume l'opération OR.

OR 0 1
0 0 1
1 1 1

Pour illustrer, tapez ce qui suit dans le mode direct de GW-BASIC :

PRINT 45 OR 54

La sortie est 63. Pourquoi ? Regardez:

101101
110110
--------
111111

Sans surprise, 111111 en décimal vaut 63.

La troisième opération booléenne, NOT, inverse simplement tous les bits. Par exemple, 1011 inversé devient 0100.

Le programme présenté dans cette section, BINARY.BAS, prend comme point de départ le code de BASE.BAS - spécifiquement, les sous-programmes pour convertir la base 10 en base 2 et vice versa.

À partir de là, vous devez, lors de l'exécution, entrer au moins un nombre binaire. Ensuite, on vous demande quelle opération vous souhaitez effectuer : AND, OR ou NOT.

Si vous choisissez NOT, les bits de votre numéro sont inversés et affichés. Si vous choisissez AND ou OR, vous devrez saisir un autre nombre binaire, après quoi les résultats de l'opération booléenne s'afficheront.

Néanmoins, vous vous demandez peut-être : pourquoi cette section s'appelle-t-il "Un jeu binaire" alors qu'il n'y a pas de jeu à trouver ?

Le programme utilitaire BINARY.BAS vous aidera grandement lorsque vous jouerez au jeu défini ci-après.

La société Bitwise n'utilise que des pièces d'or comme monnaie; mais les pièces ne comptent comme paiement que si elles atterrissent sur FACE lorsqu'elles tombent au sol. Considérez les pièces comme des bits, avec la Face fonctionnelle comme 1 et PILE comme 0.

Pour payer un objet, vous devez d'abord jeter précisément huit pièces d'or. L'achat est terminé si suffisamment de pièces jetées atterrissent sur face.

Mais si trop peu de pièces atterrissent en FACE, vous êtes autorisé à utiliser les opérateurs booléens pour apporter quelques modifications :

NOT, si l'inversion de toutes les pièces vous aidera, ou AND ou OR, mais vous devrez lancer une deuxième pile. de huit pièces à comparer avec votre pile d'origine pour utiliser les deux derniers opérateurs.

Supposons qu'un objet coûte huit pièces d'or. Vous lancez votre pile de huit pièces et elles atterrissent de cette façon :

FPPFPFFF

Il vous manque deux F. L'utilisation de NOT avec la pile donne PFFPFPPP aggraver les choses.

Donc, vous devez jeter une autre pile. Quelles sont toutes les combinaisons possibles de FACES pour la deuxième pile qui vous permettront d'acheter l'article si vous n'êtes autorisé à utiliser AND ou OR qu'une seule fois ?

Qu'en est-il de l'utilisation d'un ensemble de AND, OR ou NOT dans n'importe quelle combinaison possible, n'importe quel nombre de fois ?

Si vous enchaînez ces opérateurs, NOT a la priorité la plus élevée, suivi de AND, puis, enfin, OR.

Supposons que le coût de l'objet passe à quinze pièces d'or. Maintenant, comment l'utilisation de AND, OR ou NOT une fois - ou un certain nombre de fois - se déroule-t-elle ?

BINARY.BAS apporte principalement des modifications mineures à BASE.BAS, à savoir avec des conversions rapides de binaire en décimal et inversement (voir lignes 65, 70, 80, 85 et 90) ainsi que la modification de la conversion décimale en binaire pour gérer l'inversion de bits (voir lignes 3000 à 3007).

BINARY.BAS pourrait être fructueusement modifié dans deux directions: en permettant à l'utilisateur d'effectuer plusieurs opérations booléennes au cours d'une seule exécution du programme, et en ajoutant des opérateurs supplémentaires, tels que XOR (ou exclusif, qui donne 1 uniquement lorsque les deux bits sont différents).

Vous pourriez également envisager de coder les règles de la société Bitwise décrites ci-dessus dans un jeu cohérent; peut-être pourriez-vous même créer une histoire dans le jeu sur la société. De cette façon, les sous-programmes de l'utilitaire BINARY.BAS seraient au service direct du divertissement, plutôt que de simples calculs mathématiques prosaïques.

10 KEY OFF
15 DIM DIGITS(30)
20 CLS
30 PRINT "--- OPÉRATIONS AVEC DES NOMBRES BINAIRES ---"
40 PRINT
50 PRINT "SAISISSEZ VOTRE PREMIER NOMBRE BINAIRE: ";:INPUT NUMBER$
55 PRINT "SOUHAITEZ-VOUS: AND, OR, or NOT?"
60 INPUT "SAISISSEZ VOTRE OPÉRATION (EN MAJUSCULES UNIQUEMENT): ";OP$
65 IF OP$="NOT" THEN GOSUB 1000:NUMBER$=STR$(SUM):GOSUB 2000:GOTO 100
70 GOSUB 1000:NUM1=SUM:NUMBER$=""
75 PRINT "SAISISSEZ VOTRE DEUXIÈME NUMÉRO BINAIRE: ";:INPUT NUMBER$
80 GOSUB 1000:NUM2=SUM
82 'Ici on utilise + au lieu de AND
85 IF OP$="AND" THEN SUM=NUM1 + NUM2:NUMBER$=STR$(SUM):GOSUB 2000:GOTO 100
90 IF OP$="OR" THEN SUM=NUM1 OR NUM2:NUMBER$=STR$(SUM):GOSUB 2000:GOTO 100
100 END
1000 '*** CONVERTIR EN DÉCIMAL ***
1050 SUM=0:POWER=0
1100 LENGTH=LEN(NUMBER$)
1300 FOR T=(LENGTH-1) TO 0 STEP -1
1400 SUM=SUM+VAL(MID$(NUMBER$,T+1,1))*2^(POWER)
1450 POWER=POWER+1
1500 NEXT T
1700 RETURN
2000 '*** CONVERTIR EN BINAIRE ***
2010 INDEX=1:DIVIDEND=VAL(NUMBER$)
2050 FOR X=1 TO 30:DIGITS(X)=0:NEXT X
2060 QUOTIENT=0:REMAINDER=0
2100 WHILE DIVIDEND>0
2300 QUOTIENT=INT(DIVIDEND/2)
2400 REMAINDER=2*(DIVIDEND/2-INT(DIVIDEND/2))
2450 DIGITS(INDEX)=CINT(REMAINDER) 'LA FONCTION CINT ARRONDI LE NOMBRE
2500 INDEX=INDEX+1
2600 DIVIDEND=QUOTIENT
2700 WEND
2800 PRINT:PRINT "VOTRE OPÉRATION RÉSULTE EN UNE VALEUR BINAIRE DE:"
2900 FOR T=(INDEX-1) TO 1 STEP -1
3000 IF OP$="NOT" AND DIGITS(T)=0 THEN PRINT "1";
3005 IF OP$="NOT" AND DIGITS(T)=1 THEN PRINT "0";
3007 IF OP$<>"NOT" THEN PRINT DIGITS(T);
3100 NEXT T
3150 PRINT:PRINT
3200 RETURN

 

 

 

 

 

 

 

 

Recherche personnalisée