Comment effectuer des opérations au niveau du bit dans les formules JMP ?Bonjour, j'imagine qu'il s'agit simplement d'un problème dans lequel je ne trouve pas l'option de formule correcte, mais comment effectuer des opérations de base au niveau du bit dans une formule JMP ?
Par exemple, voici un exemple Python que j'aimerais reproduire dans JMP : lambda x : ((((x>>1)&0x1))<<2)
merci, Ross
Automatisation et scriptsAccès aux donnéesMélange et nettoyage des donnéesConception d'expériencesRe : Comment effectuer des opérations au niveau du bit dans les formules JMP ?JMP n'a pas d'opérateurs bit à bit natifs. Dans votre exemple, j'essaierais ceci
// untested code for (((x>>1)&0x1))<<2
f = function( { x },
( mod( floor( x / 2 ), 2 ) == 1 ) * 4
}x>>1 (décalage à droite 1) divise x par 2, &1 ne conserve que le moindre bit (zéro/un, pair/impair) et <<2 (décalage à gauche 2) se multiplie par 4. (En supposant que python fonctionne comme C et que je n'ai pas oublié...)
Si vous en avez beaucoup, avec des positions de bits particulières, etc., vous souhaiterez peut-être rechercher une bibliothèque de manipulation de bits. Le seul que je connaisse est dans 7 choses à savoir sur Twitter et peut ne pas être très convivial (fichier BITS.jsl dans le fichier zip). Je ne me souviens pas exactement de ce qu'il fait, mais il semble qu'il résolve le problème en transformant un nombre en une chaîne de caractères de 32 uns et zéros, puis en combinant les chaînes à l'aide des règles logiques AND/OR/etc. Il manque probablement des opérations qui n'étaient pas nécessaires. Et je suis presque sûr que la fonction HTTPRequest rendrait ce code beaucoup plus facile maintenant.
Les nombres négatifs peuvent être vraiment étranges lorsque l’on effectue les bons changements. Le bit de signe peut poser problème.
Re : Comment effectuer des opérations au niveau du bit dans les formules JMP ?hum...
J'ai ajouté une requête à la liste de souhaits : opérations sur les bits JSL
( @jthi déjà demandé en 2020)
Pour l'instant (Jmp18), quel est le moyen le plus rapide d'extraire les 32 bits d'un nombre 32 bits ?
... pour 10 millions de lignes ?
n_rows = 100000;
dt = New Table( "test", Add Rows( n_rows ), New Column( "rand int", Set each value( Random Integer( 0, 4294967295 ) ) ) );
checkBit = Function( {x, bit},
(Mod( Floor( x / 2 ^ (0 + bit) ), 2 ) == 1)
);
t0 = HP Time();
For( i = 1, i <= 32, i++,
dt << New Column( "bit" || Char(i), Set each value( checkBit( :rand int, i ) ) )
);
Show( (HP Time() - t0) / 1000000 ); // references
//BITS:NUMTOBITS from https://community.jmp.com/t5/Uncharted/7-things-to-know-about-Twitter/ba-p/21000
// faster
getBits = Function( {x},
{result = {}, i},
For( i = 4294967296 / 2, i >= 1, i /= 2,
Insert Into(
result,
If( x >= i,
x = x - i;
1;
,
0
)
)
);
Transpose(Matrix(result));
);
// ~ factor 10 faster
getBits = Function( {x},
Transpose(Matrix(Transform Each({bit}, Words(Hex( x, Base( 2 ), Pad To( 32 ) ),""),Num(bit))));
);
//getBits(4294967295);
For( i = 1, i <= 32, i++,
New Column( "bit" || Char( i ) )
);
t0 = HP Time();
mat = J( n_rows, 32, 0 );
For( myrow = 1, myrow <= n_rows, myrow++,
mat[myrow, 0] = getBits( :rand int[myrow] )
);
dt[0, N Cols( dt ) - 31 :: N Cols( dt )] = mat;
Show( (HP Time() - t0) / 1000000 );Re : Comment effectuer des opérations au niveau du bit dans les formules JMP ?n_rows = 100000;
dt = New Table( "test", Add Rows( n_rows ), New Column( "rand int", Set each value( Random Integer( 0, 4294967295 ) ) ) );
t0 = HP Time();
data = dt[0, 1];
For( i = 1, i <= 32, i++,
dt << New Column( "bit" || Char( i ) );
dt[0,i + 1] = Mod( data, 2 );
data = Floor( data / 2 );
);
Show( (HP Time() - t0) / 1000000 );
Cela déplace la plupart des boucles vers le code C++. Si vous parvenez à comprendre comment procéder avec une seule division, vous pourriez l'accélérer encore davantage. Vous souhaiterez peut-être utiliser b0 plutôt que b1 pour le nom du bit le moins significatif afin que sa valeur soit 2^0==1. Cela dépend de ce que représentent les bits.
Re : Comment effectuer des opérations au niveau du bit dans les formules JMP ?wow, super 
Re : Comment effectuer des opérations au niveau du bit dans les formules JMP ?Développeurs JMP :
S'il vous plaît, s'il vous plaît, s'il vous plaît, s'il vous plaît, ajoutez des opérateurs au niveau du bit à JSL. En analysant les fichiers journaux avec des champs de bits (comme les bits d'erreur, les bits d'état, etc.), j'ai eu tellement d'occasions d'utiliser des opérateurs au niveau du bit. Cette fonctionnalité peut également être étendue en faisant des mappages de bits définis par l'utilisateur une option dans les propriétés de colonne (c'est-à-dire bit 0 = porte ouverte, bit1 = porte fermée, ...), puis dans le générateur de graphiques, en traçant une seule variable de colonne bitmap. contre le temps, vous pouvez afficher tous les états de bits inversés.
Re : Comment effectuer des opérations au niveau du bit dans les formules JMP ?salut @BetaTreeCamel91 , as-tu voté ?
Opérations sur les bits JSL