Accéder au contenu principal

Les bases de la programmation : Le binaire

Le binaire

”Ce monde est un code binaire où nous avons seulement deux options : accepter ou refuser.

Ardit BEQIRI

Lorsque l’on parle d’ordinateur on dit très souvent que ce n’est qu’un outil qui traite des 0 et 1, et ce n’est pas faux. Si l’on résume un ordinateur à de l’électronique, effectivement la mémoire, le processeur, les périphériques peuvent se résumer à des suites binaires, donc des suites de 0 et de 1.

Mais c’est comme dire que le cerveau n’est qu’un imbroglio de neurones, c’est réducteur. La complexité du système est tel que l’on peut oublier qu’à la base c’est un système binaire, du reste un utilisateur d’ordinateur n’a même pas à savoir comment cela fonctionne, et même un programmeur n’a pas toujours à le savoir.

Cependant, tous les langages informatiques comprennent une partie binaire. Et donc la compréhension du binaire est essentielle à un moment ou à un autre. En fait il y a plusieurs sujets interconnectés, la logique binaire, les opérations binaires, les nombres binaires, etc.

La logique binaire

La logique binaire est une branche des mathématiques appelée l’algèbre de Boole. L’idée est d’étudier un algèbre (permettant de faire des calculs) reposant sur des propositions vraies ou fausses de façon à prendre des décisions.

L’algèbre de Boole définit ensuite des lois définissant des opérateurs. 

Ainsi la loi de conjonction (ET) dit : ”a ET b est VRAI si et seulement si a est VRAI et b est VRAI”. On utilise le signe comme opérateur.





Ainsi, dans la vie de tous les jours, je pourrais dire que si j’ai une voiture ET de l’essence je peux prendre la route.

La loi de disjonction (OU) dit : ”a OU b est VRAI si et seulement si a est VRAI ou b est VRAI”. On utilise le signe comme opérateur.



Dans la vie de tous les jours, je pourrais dire que si j’ai une voiture OU une moto je peux voyager.

La loi de négation dit : "a est VRAIE si et seulement si a est FAUX”. Il s’agit simplement d’une inversion de la proposition. On note la négation en utilisant une barre au-dessus de la proposition.



Dans la vie de tous les jours, on dirait que je peux me reposer si je n’ai PAS de travail à finir.

La loi de disjonction exclusive (XOR) dit : ”a XOR b est VRAI si et seulement si a est VRAI ou b est VRAI mais pas les deux”. On utilise le signe comme opérateur.



Dans la vie de tous les jours, on pourrait dire ”Je vais prendre la voiture OU la moto pour partir en vacances.”. La langue française ne fait pas la différence entre le ou inclusif (OU) et le ou exclusif (XOR).

Cette façon de penser les propositions est très utilisé en informatique, la notation diffère d’un langage à l’autre, mais l’esprit reste.

Les tests

À la base d’un processeur il y a des portes logiques, c’est à dire des éléments électroniques agissant comme un opérateur de l’algèbre de Boole. Une porte logique s’applique à une ou deux propositions (représentées par des bits).

  1. La porte NOT inverse la valeur, ainsi le 0 devient un 1, et le 1 devient un 0. C’est l’équivalent de la négation en algèbre de Boole.
  2. La porte OR est un ”ou inclusif”. Elle prend deux bits en entrée et si un des deux bits est à 1 elle renvoie 1, sinon elle renvoie 0. C’est l’équivalent de la disjonction inclusive en algèbre de Boole.
  3. La porte AND est un ”et”. Elle prend deux bits en entrée et si les deux bits sont à 1 elle renvoie 1. C’est l’équivalent de la conjonction en algèbre de Boole.

Les trois portes ne sont pas notées de la même façon selon les langages mais il y a en réalité deux grandes notations, celle qui vient du Basic et celle qui vient du C. Voici un tableau non-exhaustif montrant les différentes façons de faire.


Langage

NOT

ET

OU inclusif

Basic,

LISP,

Python,

LOGO,

Pascal,

PHP,

Forth,

Ruby

NOT

AND

OR

C,

C#, 

C++,

Objective-C,

JavaScript

!

&&

||

Perl,

Ocaml

!, not

&&, and

||, or

Prolog

\

/\

\/


Remarque: Ce tableau n’a évidemment rien d’exhaustif. Il existe des milliers de langages mais ce qu’il faut remarquer c’est la constance des opérations de base.

Prenons un exemple pour que cela soit plus parlant. Nous avons une voiture ou une moto et de l’essence à mettre dedans pour partir en vacances. En français nous dirions :

Je partirai en vacances si j’ai une voiture ou une moto et de l’essence à mettre dedans.

En Basic moderne nous écririons :

IF ( VOITURE OR MOTO ) AND ESSENCE THEN

GOTO VACANCES

ENDIF

En C, nous écririons :

if( ( VOITURE  || MOTO ) && ESSENCE ) { 

    partir_en_vacance( ); 

}

En Perl, nous écririons :

partir_en_vacance if( (VOITURE or MOTO) && ESSENCE );

On le voit, l’idée est la même, la syntaxe diffère. La plupart du temps il ne faut pas avoir peur d’un nouveau langage car presque tout ce que vous avez appris dans un autre langage est transposable, ou en tout cas l’essentiel.

Les grandes difficultés dans l’apprentissage d’un langage sont souvent concentrées dans le premier même si les spécificités de chaque langage demandent un effort supplémentaire. Mais les habitudes sont tenaces et lorsque l’on en a pris on a du mal à en sortir. Certains ne supportent pas python à cause de son organisation avec des tabulations, d’autres ne supportent pas le C avec ses points-virgules qui termine une fonction, d’autres encore ne supportent pas Java et ses trop nombreux fichiers, etc. 

On le voit, les problèmes sont souvent liés à la forme et pas au fond. Il faudrait être capable de faire abstraction de la forme lorsque l’on choisit un langage, mais nous sommes humains.


Commentaires

Posts les plus consultés de ce blog

archivedDataWithRootObject

archivedDataWithRootObject: est deprecated depuis IOS12.   NSData *data = [ NSKeyedArchiver archivedDataWithRootObject : @{} ]; // deprecated ISO12 Cela va avec l'avancée de SWIFT qui ne permet pas facilement de faire des tableaux de "trucs" non définis. C'est la nouvelle option requiringSecureCoding qui indique si le tableaux (NSDictionnary ou NSArray) peut contenir n'importe quoi ou uniquement des objets bien définis.   NSData  *data  = [ NSKeyedArchiver   archivedDataWithRootObject : @{}   requiringSecureCoding : NO   error :&error]; Le problème est que la fonction pour dés-archiver n'est pas deprecated, mais plante ! NSDictionary *dico = [ NSKeyedUnarchiver unarchivedObjectOfClass : NSDictionary . class                                                          fromData :data error :&error];  // plante Si l'on désire faire comme avant, il faut un requiresSecureCoding:NO, mais il n'y a pas le pendant du archivedDataWithRootObject ! Il n&#

Adapter l'interface à la taille des caractères pour malvoyants.

Depuis quelques temps, je fais attention aux réglages de la taille des caractères systèmes. Les malvoyant peuvent décider dans les Réglages de l'iPad, Accessibilité de changer la taille des textes par défaut : Mais dans ce cas, les interfaces sont souvent trop petites, et les texte ne rentre pas dedans. Si vous avez besoin d'une valeur en pixel, en proportion du niveau de zoom des caractères, vous devez utilisez UIFontMetrics. if ( @available (iOS 11.0 , *)) {    larg = [ UIFontMetrics . defaultMetrics scaledValueForValue :larg]; } Ici, vous ne verrez aucune différence à moins de changer les réglages d'accessibilité. Mais, si vous touchez aux réglages, votre valeur en pixels correspondra au niveau de zoom. Cette fonctionnalité n'existe que depuis IOS 11, il faut donc mettre un available si vous compilez comme moi des apps pour IOS9. Je me sers de cette fonctionnalité, par exemple, dans : - ( CGSize ) collectionView :( UICollectionView *)collectionView             layo

UISceneSession is only available on iOS 13

Lorsque vous faites une nouvelle application, celle-ci est par défaut pour le dernier IOS.  Mais si vos clients, comme les miens, ont de vieux appareils, vous pourriez vouloir que votre application fonctionne avec IOS9 (pour le moment on peut encore faire des apps IOS9, mais je crois que la limite sera IOS12 dans pas longtemps). Dans les infos de déploiement, vous changez donc le IOS 14  en IOS 9. Mais, le lancement de l'app vous donne un écran noir ! Pour régler le problème, il faut ajouter une propriété "window" dans l'interface du appDelegate. @interface AppDelegate : UIResponder < UIApplicationDelegate > @property ( strong , nonatomic ) UIWindow * window ; @end Reste les warnings... Le plus simple est de faire confiance à Xcode, tapez sur les warnings et un menu vous proposera un "fix" qui ajoutera un API_AVAILABLE à la définition de la fonction. - ( void ) scene :( UIScene *)scene willConnectToSession :( UISceneSession *)session options :(