Wie führt man bitweise Operationen in JMP-Formeln durch?Hallo, ich stelle mir vor, dass dies einfach ein Problem ist, bei dem ich nicht die richtige Formeloption finde, aber wie führt man grundlegende bitweise Operationen in einer JMP-Formel durch?
Hier ist beispielsweise ein Python-Beispiel, das ich in JMP replizieren möchte: Lambda x: ((((x>>1)&0x1))<<2)
Danke, Ross
Automatisierung und SkripterstellungDatenzugriffDatenmischung und -bereinigungVersuchsplanungBetreff: Wie führt man bitweise Operationen in JMP-Formeln durch?JMP verfügt über keine nativen bitweisen Operatoren. In Ihrem Beispiel würde ich das versuchen
// untested code for (((x>>1)&0x1))<<2
f = function( { x },
( mod( floor( x / 2 ), 2 ) == 1 ) * 4
}x>>1 (Rechtsverschiebung 1) dividiert x durch 2, &1 behält nur das kleinste Bit (null/eins, gerade/ungerade) und <<2 (Linksverschiebung 2) multipliziert mit 4. (Vorausgesetzt, Python funktioniert wie C und ich habe es nicht vergessen ...)
Wenn Sie viele davon mit besonderen Bitpositionen usw. haben, sollten Sie nach einer Bitmanipulationsbibliothek suchen. Der einzige, den ich kenne, ist in 7 Dinge, die Sie über Twitter wissen sollten und möglicherweise nicht sehr benutzerfreundlich (BITS.jsl-Datei in der ZIP-Datei). Ich weiß nicht mehr genau, was es tut, aber es sieht so aus, als würde es das Problem lösen, indem es eine Zahl in eine Zeichenfolge aus 32 Einsen und Nullen umwandelt und die Zeichenfolgen dann mithilfe der logischen Regeln UND/ODER/usw. kombiniert. Es fehlen wahrscheinlich alle Vorgänge, die nicht benötigt wurden. Und ich bin mir ziemlich sicher, dass die HTTPRequest-Funktion diesen Code jetzt viel einfacher machen würde.
Negative Zahlen können bei richtigen Verschiebungen wirklich seltsam sein. Das Vorzeichenbit kann Probleme bereiten.
Betreff: Wie führt man bitweise Operationen in JMP-Formeln durch?Hm...
Ich habe eine Anfrage zur Wunschliste hinzugefügt: JSL-Bitoperationen
( @jthi bereits im Jahr 2020 angefragt)
Was ist vorerst (Jmp18) der schnellste Weg, die 32 Bits einer 32-Bit-Zahl zu extrahieren?
... für 10 Mio. Zeilen?
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 );Betreff: Wie führt man bitweise Operationen in JMP-Formeln durch?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 );
Dadurch werden die meisten Schleifen in C++-Code verschoben. Wenn Sie herausfinden, wie es mit einer Teilung geht, können Sie es vielleicht noch etwas beschleunigen. Möglicherweise möchten Sie b0 anstelle von b1 für den Namen des niedrigstwertigen Bits verwenden, damit sein Wert 2^0==1 ist. Hängt davon ab, was die Bits darstellen.
Betreff: Wie führt man bitweise Operationen in JMP-Formeln durch?Wow großartig 
Betreff: Wie führt man bitweise Operationen in JMP-Formeln durch?JMP-Entwickler:
Bitte, bitte, bitte, bitte, bitte fügen Sie JSL bitweise Operatoren hinzu. Beim Analysieren von Protokolldateien mit Bitfeldern (wie Fehlerbits, Statusbits usw.) hatte ich so viele Gelegenheiten, bitweise Operatoren zu verwenden. Diese Funktion kann auch erweitert werden, indem benutzerdefinierte Bitzuordnungen zu einer Option in den Spalteneigenschaften gemacht werden (z. B. Bit 0 = Tür offen, Bit1 = Tür geschlossen, ...) und dann im Graph Builder, indem Sie eine einzelne bitzugeordnete Spaltenvariable über die Zeit aufzeichnen, können Sie alle Bitzustände umschalten.
Betreff: Wie führt man bitweise Operationen in JMP-Formeln durch?Hallo @BetaTreeCamel91 , hast du abgestimmt?
JSL-Bitoperationen