-1 ^ 1 ??

-1 ^ 1 ?? - C - Programmation

Marsh Posté le 29-01-2005 à 21:58:16    

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é
Reply

Marsh Posté le 29-01-2005 à 21:58:16   

Reply

Marsh Posté le 29-01-2005 à 22:42:29    

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.
Reply

Marsh Posté le 29-01-2005 à 23:21:03    

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


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 29-01-2005 à 23:31:32    

-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.
Reply

Marsh Posté le 29-01-2005 à 23:47:13    

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 ?

Reply

Marsh Posté le 30-01-2005 à 00:39:47    

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é
Reply

Marsh Posté le 30-01-2005 à 00:41:49    

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 ?

Reply

Marsh Posté le 30-01-2005 à 00:42:10    

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é
Reply

Marsh Posté le 30-01-2005 à 00:43:02    

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é
Reply

Marsh Posté le 30-01-2005 à 00:44:22    

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
 

Reply

Marsh Posté le 30-01-2005 à 00:44:22   

Reply

Marsh Posté le 30-01-2005 à 00:46:08    

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é
Reply

Marsh Posté le 30-01-2005 à 00:59:05    

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é
Reply

Marsh Posté le 30-01-2005 à 01:08:16    

oui

Reply

Marsh Posté le 30-01-2005 à 15:37:53    

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)
Reply

Marsh Posté le 30-01-2005 à 18:35:46    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed