1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

Résolu Questionnement à propos des bits

Discussion dans 'Discussion & Aide au développement' démarrée par Neg, 13 Mars 2013.

Statut:
Fermé aux futures réponses.
  1. Neg

    Neg Le Lama

    Bonjour à tous,

    Premier message dans cette section, j'espère que vous pourrez m'aidez car là que bloque réellement :) 

    En fait ce sont plus des questions de vocabulaire qu'autre choses que je ne comprends pas. Voici la liste des mos qui sont vraiment confus pour moi :

    - DIfférence entre : bit, bits, bytes, bit à bit, bitsums, bit-fields, bite-wise ?
    Je suis allé sur AlliedModders, programmer en C, le site du zéro, wikipedia et franchement et bah je pense que je suis dans un chapitre du Pawn assez complexe et je galère bien :p 

    Sinon quelque chose que je n'ai pas trouvé c'est qu'on dit qu'on code en base 10 ou 2 etc. Alors là je ne comprends rien du tout à ces bases ? C'est quoi exactement ?

    Voilà je vous remercie d'avance et à bientôt :) 

    PS: Je suis les tutos suivant :
    [TUT] Bits, Bit-fields, and Bit-wise Operators - AlliedModders
    [INFO] Bitsums and Operators - AlliedModders
    Les opérateurs bits à bits
    http://www.bien-programmer.fr/bits.htm

    Bonne fin de journée à vous ! Je suis impatient de reçevoir quelques unes de vos réponse qui m'aideront surement :D 
     
  2. Arkshine

    Arkshine Le Docteur

    Hello,

    Je ne m'attendais pas forcemment à ce genre de questions, qui n'est pas une spécificité du Pawn, mais de la programmation en générale et des bases en informatique.:p 
    Tu comprendras que l'on ne va pas te faire de cours complet vu qu'il y a des tutoriels à foison, qui sont complets et expliquent bien mieux, mais je peux tenter d'expliquer rapidement certains points.

    base 10 - tu devrais facilement comprendre : http://villemin.gerard.free.fr/Wwwgvmm/Numerati/ConDecim.htm
    base 2 - La même chose, mais en représentation binaire, donc avec des 0 et 1.
    -> Voir également : Base (arithmétique) - Wikipédia.

    bit - chiffre binaire. Prends comme valeur 0 ou 1.
    byte - unité de mesure et d'allocation la plus petite qu'on puisse adresser. 1 byte = 8 bits.
    bit-field - série de bits qui se suivent, comme par exemple : 00000000 , série de 8 bits.
    bit à bit - un chiffre numérique, par exemple, 2, peut s'écrire en représentation binaire (base 2) : 0010 et tu peux faire des opérations bit à bit.
    bit-wise - terme qui désigne les opérations qui traitent une valeur en un tableau de bits. Tout comme tu utiliserais "+", "-", etc, sur des nombres numériques, il y a des opérateurs "&", "|", etc pour travailler avec des bits.
    bit-sum - simplement une somme de bits.

    C'est vraiment en simplifiant. Juste un début de réponse.

    Je ne connais moi-même pas très bien ces bases là, mais tu trouves beaucoup de références, d'explications sur le net.
    J'insiste sur le fait que ça fait partie des bases en informatique, et pas du Pawn.

    Après il faut se dire, que dans la majorité des plugins que tu feras en Pawn, tu n'en auras pas vraiment besoin, sauf p-e les plus courants comme les opérations bitwise tels que &, |, ~, etc, qui sont simple à utiliser et ne nécessite pas forcemment une connaissance approfondie de la chose.

    Ceci dit, tu apprendras plus par la pratique, et en posant des questions précises. :) 
     
    Dernière édition: 13 Mars 2013
    • J'aime J'aime x 1
  3. Neg

    Neg Le Lama

    Merci bien j'ai pratiquement tout décortiquer se que tu m'a donné. Si j'ai bien compris. Prenons par exemple le nombre 12 qui est en base 10. Je souhaite le convertir en base 2 :

    Code (Text):
    12 / 2 = 6 ; reste 0
    6 / 2 = 3 ; reste 0
    3 / 2 = 1 ; reste 1
    1 / 1 = 1 ; reste 0
    Donc en base 2, le nombre 12 vaut 0100 ?

    Un autre exemple au cas où ^^ :
    Prenons le nombre 145. (base 10)
    On le met en base 2 :

    Code (Text):
    145 / 2 = 72 ; reste 1
    72 / 2 = 36 ; reste 0
    36 / 2 = 18 ; reste 0
    18 / 2 = 9 ; reste 0
    9 / 2 = 4 ; reste 1
    4 / 2 = 2 ; reste 0
    2 / 2 = 1 ; reste 0
    1 / 2 = 0 ; reste 1
    Donc le résultat est : 1001 0001 ?

    En gros quand je fais 9 / 2 = 4 normalement c'est égal à 4.5 donc dès que le nombre est décimal le reste vaut 1 et quand le nombre est un entier le reste vaut 0. Puis on lit du bas vers le haut les réponses et on a autre nombre en binaire.

    Donc maintenant si je veux faire l'addition de mes deux nombres binaires :
    145 & 12
    Sa revient à avoir : 1001 0001 & 0100
    Le problème c'est qu'il n'y a pas le même nombre de bits. Ainsi il faut tout simplement ajouter des 0 avant pour avoir un octet (=8 bits, =1 byte).
    Donc on en est là :
    1001 0001 & 0000 0100
    Se qui nous donne :
    0000 0000 ? Bizzard je trouve pas vous ?

    Sinon et bien il ne me reste plus qu'à te remercier, je pense que j'ai bien compris. En fait, je voulais bien comprendre ce point là qui me parraissait assez complex à première vue avant de vouloir faire du pawn pour du pawn sans réellement comprendre pourquoi parfois on met :

    PHP:
    #define TATATA1 | TATATA2
    par exemple hein ^^ . J'aime comprendre se que je fais :) 
    Et puis prochaine étape si je suis au point et bah essayer d'utiliser ces opérateurs en Pawn héhé :p 
    Ais-je compris selon vous docteur ? :pompous: 

    Je tenais à te remercier pour ta réponse.
     
  4. Arkshine

    Arkshine Le Docteur

    Si tu faisais plus attention, tu verrais que tu n'as pas bon.
    Tu dois mettre 1 si il y a un reste.
    1 / 2 -> ne te donne pas 0.

    La bonne réponse est donc : 1100.
    Tu peux vérifier en faisant : 1 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 2^0 = 8 + 4 + 0 + 0 = 12.

    La force est avec toi ! :D 

    Ce n'est pas pour faire une addition le "&". C'est un ET logique. Pour vérifier si les bits d'une valeur existent pour les 2 à la même place. Tu as des exemples dans le tutoriel [TUT] Bits, Bit-fields, and Bit-wise Operators - AlliedModders.

    Classique usage avec & : un plugin qui a une cvar avec des options et chaque option est une puissance de 2 : 1, 2, 4, 8, etc.
    Ce qui fait que l'utilisateur pour définir une ou plusieurs options en ajoutant : 2 + 8 par exemple.
    Et dans le plugin, tu peux faire if( valeurCvar & 2), if( valeurCvar & 4), etc ; pour savoir s'il a choisi telle option.

    Tu n'utilises pas d'opérateur sur des représentations binaires.
    Pour faire une addition sur un chiffre binaire, c'est comme avec les nombres décimales mais drastiquement simplifié.
    Tu as une explication et exemple ici : Système binaire - Wikipédia

    | est un OU logique. Pareil qu'au dessus. Dû mal à trouver les mots en français. :whistle: 

    Mais généralement, dans les plugins, ça travaille directement avec des puissances de 2, ce qui fait que tu peux écrire aussi : TATATA1 + TATATA2.
    Cependant, ça peut être utile d'utiliser "|", parce que si tu ajoutes 2 fois la même valeur, tu auras des résultats différents avec | et +. Par exemple 2 | 2 | 4 va te donner 6 (vu que le bit 2 a déjà été inclus), tant dis que 2 + 2 + 4 = 8. Je ne sais pas si tu me suis bien. :p 
     
  5. Neg

    Neg Le Lama

    Suis-je bête ^^, j'ai refait le calcul pour comprendre mon erreur. Je trouve le même résultat que toi :) .

    Très intéressant sa ! Je me demandais d'ailleurs comment passer de base 2 en base 10. Merci bien.

    Oui je me suis mal exprimé mais j'avais compris le concepte ^^

    Mmmh, normalement dans un simple menu, le client choisis entre la touche 1, 2, 3, 4, 5, 6, 7, etc ... et là tu dis que chauque option est une puissance donc le menu sera du style :
    1 - Item 1
    2 - Item 2
    4 - Item 3
    8 - Item 4
    J'ai un peu de mal à la compréhension je t'avouerais.

    Sinon se qui est de la suite, sa va à peut pret, je vais m'exercer.
     
  6. Arkshine

    Arkshine Le Docteur

  7. Neg

    Neg Le Lama

    Merci sa fait plus d'une heure que j'essaye de décortiquer ce code et j'ai enfin compris :)  . Merci bien maintenant quand je relis tes réponses un peu plus haute je les comprends parfaitement bien.

    On peut vraiment faire plein de choses avec ces opérateurs !

    Je voulais savoir j'ai compris le fonctionnement des opérateurs de décalages << et >> mais franchement je ne vois pas vraiment l'utilité de faire cela par exemple :

    2 = 0000 0010
    2 << 2 = 0000 1000

    Franchement déplacer un vit pour moi, certes, sa change la valeur mais enfin ... Je vois pas vraiment l'utilité ?

    Bonne fin de soirée en fait :) 
     
  8. Arkshine

    Arkshine Le Docteur

    Je ne sais pas. Je n'ai jamais eu l'usage non plus. :p 
    Ce qui est souvent utilisé, c'est le décalage d' 1 à gauche, genre : 1 << 5, qui équivaut à 2^5.

    Tu verras souvent des #define comme :

    1<<0
    1<<1
    1<<2
    etc.

    au lieu de :

    1
    2
    4
    etc..

    Mais les 2 font la même chose dans ce cas.
    A l'utilisation 1 << x peut s'avérer utile dans un code.
     
  9. Neg

    Neg Le Lama

    Intéressant, mais je viens de me rendre sur AM et je vois cette ligne de code par exemple :
    const Wep_m4a1 = ((1<<CSW_M4A1))

    Tiré d'ici même :
    http://forums.alliedmods.net/.php?t=109427

    Bon et bah là CSW_M4A1 vaut 0419 4304 et bah franchement l'utilité de faire sa qu'elle est-elle ? Même si de n'est peut être que le code de cette personne n'est pas bien pourquoi a-t-il mît cela selon vous ?
     
  10. Arkshine

    Arkshine Le Docteur

    C'est par rapport à if (Wep_m4a1 & (1<<weapons))

    Mais ici, y'en a pas vraiment besoin, il aurait pu directement vérifier l'index comme : weapons[ i ] == CSW_M4A1.
    Ca aurait pu utile, si Wep_ contenait plusieurs bits, genre : Wep_ = CSW_M4A1 | CSW_M3
    Ce qu'il fait, c'est pratique pour factoriser un code, mais pour son code, c'est inutile.

    Tu peux même simplifier en récupérant la somme des bits de toutes les armes ( pev_weapons ) ; et il n'aurait pas à boucler, juste à vérifier du genre : someBits & 1<<M4A1.
     
    • Sympa ! Sympa ! x 1
  11. ConnorMcLeod

    ConnorMcLeod Modérateur

    L'idée est de faire entrer une valeur unique dans une autre valeur unique, donc chaque bit à sa signification, son utilité, et la variable peut contenir chacune de ces spécificités, contrairement à la suite 1 2 3 4.
    C'est comme le système des droits admins.

    Pour le code dont tu parles, je ne l'ai pas lu, mais tu ne dois pas te soucier de la valeur de 1<<23 ou de 1<<24, on écrit justement 1<<23 ou Wep_m4a1 pour que ce soit plus lisible, plus facile à écrire.

    Tout ce système n'est que très rarement utile, ne t'attarde pas trop là dessus jusqu'au jour où tu en auras vraiment besoin, ça sera bien assez tôt.

    Suffit que tu comprennes brièvement comment c'est construit et les opérations & | et ~
     
    • J'aime J'aime x 1
  12. Arkshine

    Arkshine Le Docteur

    ~( !( 1 << Connor ) ) ; ça donne quoi comme résultat ?
     
  13. ConnorMcLeod

    ConnorMcLeod Modérateur

    0xFFFFFFFF
    --- Message fusionné : 13 Mars 2013 ---
    en 32bits
    --- Message fusionné : 13 Mars 2013 ---
    Si tant est que Connor soit bien un entier naturel !
     
  14. Arkshine

    Arkshine Le Docteur

    Putain, comment t'es trop fort. J'hésite entre l'orgasme :X3:  et le claquage de dent :nailbiting:  ; devant tant de puissance mentale.
     
  15. ConnorMcLeod

    ConnorMcLeod Modérateur

    Des années d'apprentissage !
     
  16. Neg

    Neg Le Lama

    :ROFLMAO: 

    J'ai terminer de consulter le tutoriel sur AM : [TUT] Bits, Bit-fields, and Bit-wise Operators - AlliedModders

    Franchement, je pense avoir compris les bases des bits.

    Néanmoins, je galère encore sur un petit point avant d'avoir terminé de vous embêter avec mes soucis :p 

    Bien, bien, bien. Donc voici une petite ligne assez récurente dans de nombreux code : Par exemple si l'on veut faire un pluton qui, à chaque début de round donnes des armes aléatoirement :

    PHP:
    g_Weapons = ( 1 << CSW_SG550 ) | ( 1 << CSW_AWP ) | ( 1 << CSW_G3SG1 );
    Donc les armes ont des index allant de 1 à 32. Donc ici ont pourrait marquer ceci se serait exactement la même chose que la ligne du dessus mais en moins lisible : (je l'écrit quand même)

    PHP:
    g_Weapons = ( 1 << 13 ) | ( 1 << 18 ) | ( 1 << 24 );
    1) Pourquoi décaler de 13 positions vers la gauche ? (de 18, de 24) Sachant qu'amxx ne supporte que 4 bytes si l'on déplace de 24 positions les bits ils y en a qui vont disparaitre ...

    2) Si on décale vers la gauche, pourquoi ne pas plutôt le faire vers la droite ? Cette question mérite d'être posé je pense.

    3) Enfin, pour la devine suivante :
    PHP:
    #define ClearPlayerBit(%1,%2)   (%1 &= ~(1 <<(%2&31)))
    La seule chose que je ne comprends pas ou que j'ai pur de mal interprêter c'est le sigle &=. Si vous avez une petite idée ? :) 

    Allé bonne nuit les Loulou !
     
  17. ConnorMcLeod

    ConnorMcLeod Modérateur

    1. Tu confonds byte et bit (au moins tu sais ce qu'est une bite), il y'a bien 32 bits dans une cellule, donc tu peux mettre 0 ou 1 pour chaque bit.
    Relis le tuto sur les bits je crois qu'il y'a des schémas avec des cases où tout est bien expliqué.

    2. 1 est le 1er bit, donc si tu décales vers la droite il ne reste rien

    3. Voir l'utilisation du signe égal après n'importe quel opérateur, comme +=, *=, /=, -=, tu verras qu'on utilise de la même façon <<=, &=et |=
     
  18. Neg

    Neg Le Lama

    Sisi, j'ai comrpis la différence entre bits et bytes.
    1 bit = 1 chiffre binaire qui prend la valeur, soit de 0 soit 1.
    Byte = 1 Byte est une chaîne de 8 bits (0000 0101, par exemple).

    Quand je vous dis de décaler de 13 positions vers la gauche je pensais ici en bits donc déplacer de 13 bits. Amxx supporte au maximum 4 bytes donc 32 bits si je ne me trompe pas ? Il ne me semble pas que sa marche en 64bits (8bytes).

    Donc en gros se que je dis c'est que si je déplace de 24 bits vers la gauche :
    PHP:
    ( 1 << 24 )
    Et bien plusieurs bits auront dépassé le 32 bits et ainsi auront disparu ? Et c'et pourquoi je ne comprends pas pourquoi exécuter ce code :
    PHP:
    (1 << CSW_G3SG1)
    En français cette ligne veut dire quoi ? A part qu'on déplace des bits ?

    Logique, j'ai compris. Merci bien :)  Mais du coup là je suis d'accord avec se vous vous dites que les bits vont disparaître masi si on décale à gauche sa va être la même mais sa disparaîtrais plus tard certes...

    Pour le point 3 merci j'ai bien compris.

    Bonne fin de journée :D 
     
  19. Arkshine

    Arkshine Le Docteur

    Tu ne déplaces pas de 13 positions, mais de 1.
    13 c'est ta valeur hein !
     
  20. Neg

    Neg Le Lama

    Je suis retourner sur AM et voilà se que je vois :

    Ainsi, ici on voit que 15 c'est la valeur (0000 1111) et qu'on va déplacer de 4 positions vers la gauche.

    Soit X et Y ; X étant la valeur et Y la position à effectuer soit : X << Y

    Et là dans l'exemple que j'ai mis :
    PHP:
    (1 << CSW_G3SG1)
    Vous me dites que CSW_G3SG1 est la valeur et que 1 est le nombre de positions ? (Je ne sais pas si je suis clair).

    Donc, en grois vous écrivez ceci :
    Soit X et Y ; X étant la valeur et Y la position à effectuer soit : Y << X

    Se qui est l'inverse avec se que j'ai compris et lu ici il me semble :censored: 
    [TUT] Bits, Bit-fields, and Bit-wise Operators - AlliedModders

    Edit: Je pensais que le nombre de bits à décaler se trouvais à droite et que la valeur était à gauche. Vous de dites le contraire si je comprends se que je lis ?
     
Statut:
Fermé aux futures réponses.

Partager cette page

Chargement...
Chargement...