Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
744 connectés 

  FORUM HardWare.fr
  Programmation
  C

  -1 ^ 1 ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

-1 ^ 1 ??

n°965644
joce
Architecte / Développeur principal
"BugHunter"
Posté le 29-01-2005 à 21:58:16  profilanswer
 

MySQL vient de corriger un bug que j'ai reporté, et la diff du fix consiste en :
 
-      swap= -1; /* swap sign of result */
+      swap= -1 ^ 1; /* swap sign of result */
 
J'avoue que je capte pas du tout le fix, c'est quoi la subtilité du -1 ^ 1 ?
 
La description du bug c'est :
 
    Fix for a bug in multi table updates, when offset of one table is  
    5 bytes or more. This occured because in that case binary(5) indexed
    column is space packed, so it was hit by this bug in the function
    for binary comparison.


---------------
Protèges carnets personnalisés & accessoires pour bébé
mood
Publicité
Posté le 29-01-2005 à 21:58:16  profilanswer
 

n°965666
printf
Baston !
Posté le 29-01-2005 à 22:42:29  profilanswer
 

Avant le patch: tous les bits de swap sont à 1.
Après le patch: tous les bits de swap sont à 1, sauf celui de poids faible.
 
Reste à savoir pourquoi, en fonction du contexte.


---------------
Un matin je me lèverai et il fera beau.
n°965679
joce
Architecte / Développeur principal
"BugHunter"
Posté le 29-01-2005 à 23:21:03  profilanswer
 

heu je capte toujours pas, avant le patch, swap vaut pas -1 :??:


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°965687
printf
Baston !
Posté le 29-01-2005 à 23:31:32  profilanswer
 

-1 en décimal. En binaire (complément à 2), tous les bits sont à 1.
 
Ça, c'est avant le patch.
 
Ce dernier rajoute un XOR (opérateur ^) avec 1, qui a pour effet de mettre à zéro le bit de poids faible.
 
C'est dans quel fichier (en voyant le contexte ce sera plus simple) ?


---------------
Un matin je me lèverai et il fera beau.
n°965695
Taz
bisounours-codeur
Posté le 29-01-2005 à 23:47:13  profilanswer
 

t'es pas entrain de nous prendre la tête pourquoi une variable swap perdue dans des milliers de lignes de code passe de -1 à -2 ?

n°965719
joce
Architecte / Développeur principal
"BugHunter"
Posté le 30-01-2005 à 00:39:47  profilanswer
 

printf a écrit :

-1 en décimal. En binaire (complément à 2), tous les bits sont à 1.
 
Ça, c'est avant le patch.
 
Ce dernier rajoute un XOR (opérateur ^) avec 1, qui a pour effet de mettre à zéro le bit de poids faible.
 
C'est dans quel fichier (en voyant le contexte ce sera plus simple) ?


sachant que swap est un int, ca a toujours un sens ?
le fait d'utiliser l'opérateur xor caste implicitement le -1 en binaire ?
 
pour la fonction complète qui fait la comparaison binaire de deux caractères :
 

Code :
  1. static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
  2.                        my_bool part_key, my_bool skip_end_space)
  3. {
  4.   uint length= min(a_length,b_length);
  5.   uchar *end= a+ length;
  6.   int flag;
  7.   while (a < end)
  8.     if ((flag= (int) *a++ - (int) *b++))
  9.       return flag;
  10.   if (part_key && b_length < a_length)
  11.     return 0;
  12.   if (skip_end_space && a_length != b_length)
  13.   {
  14.     int swap= 0;
  15.     /*
  16.       We are using space compression. We have to check if longer key
  17.       has next character < ' ', in which case it's less than the shorter
  18.       key that has an implicite space afterwards.
  19.       This code is identical to the one in
  20.       strings/ctype-simple.c:my_strnncollsp_simple
  21.     */
  22.     if (a_length < b_length)
  23.     {
  24.       /* put shorter key in a */
  25.       a_length= b_length;
  26.       a= b;
  27.       swap= -1^1;                                 /* swap sign of result */
  28.     }
  29.     for (end= a + a_length-length; a < end ; a++)
  30.     {
  31.       if (*a != ' ')
  32.         return ((int) *a - (int) ' ') ^ swap;
  33.     }
  34.     return 0;
  35.   }
  36.   return (int) (a_length-b_length);
  37. }


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°965721
chrisbk
-
Posté le 30-01-2005 à 00:41:49  profilanswer
 

joce a écrit :

sachant que swap est un int, ca a toujours un sens ?
le fait d'utiliser l'opérateur xor caste implicitement le -1 en binaire ?


 
houla, que diable veut dire ceci ?

n°965722
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-01-2005 à 00:42:10  profilanswer
 

Taz a écrit :

t'es pas entrain de nous prendre la tête pourquoi une variable swap perdue dans des milliers de lignes de code passe de -1 à -2 ?


non, je cherche à savoir la signification de la syntaxe de -1^1 dans ce cas précis.
Apparement printf a compris ce que je demandais, mais toi tu peux pas t'empêcher de prendre les gens de haut ?


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°965723
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-01-2005 à 00:43:02  profilanswer
 

chrisbk a écrit :

houla, que diable veut dire ceci ?


ba je sais pas, faire un XOR sur un int ca me parait intuitivement bizarre, donc j'imagine qu'il prend la representation binaire du truc de façon implicite ?


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°965724
chrisbk
-
Posté le 30-01-2005 à 00:44:22  profilanswer
 

joce a écrit :

ba je sais pas, faire un XOR sur un int ca me parait intuitivement bizarre, donc j'imagine qu'il prend la representation binaire du truc de façon implicite ?


 
bin pour ton compilo, un int c'est juste 32 bits a la suite (donc forcement du binaire). Y va pas se poser des questions philosophique la dessus
 

mood
Publicité
Posté le 30-01-2005 à 00:44:22  profilanswer
 

n°965725
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-01-2005 à 00:46:08  profilanswer
 

chrisbk a écrit :

bin pour ton compilo, un int c'est juste 32 bits a la suite (donc forcement du binaire). Y va pas se poser des questions philosophique la dessus


vu comme ca c'est vrai :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°965727
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-01-2005 à 00:59:05  profilanswer
 

donc d'après ce que je comprends du code, si          
return ((int) *a - (int) ' ') ^ swap;
 
est executé, on est sur de garder le premier bit tel quel alors que tous les autres bits sont inversés ?


Message édité par joce le 30-01-2005 à 00:59:44

---------------
Protèges carnets personnalisés & accessoires pour bébé
n°965732
matafan
Posté le 30-01-2005 à 01:08:16  profilanswer
 

oui

n°966028
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 30-01-2005 à 15:37:53  profilanswer
 

joce a écrit :

ba je sais pas, faire un XOR sur un int ca me parait intuitivement bizarre, donc j'imagine qu'il prend la representation binaire du truc de façon implicite ?


euh... que tu sois en C, ou autre, le résultat final est du binaire hein... un programme est traduit en assembleur, dont chaque instruction possède une opcode binaire...
un int c'est quoi ? 32 bits ! que tu fasses un XOR sur 32 bits, ou 16, ou 8, ou est le problème :??:
 
edit: [:benou_grilled]
c'est décidé, je passe de 8 posts par page à 15, marre de me faire griller :fou:


Message édité par Harkonnen le 30-01-2005 à 15:39:08

---------------
J'ai un string dans l'array (Paris Hilton)
n°966187
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-01-2005 à 18:35:46  profilanswer
 

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  -1 ^ 1 ??

 

Sujets relatifs
Plus de sujets relatifs à : -1 ^ 1 ??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR