¿Cómo se realizan operaciones Bitwise en fórmulas JMP?Hola, me imagino que esto es simplemente un problema en el que no encuentro la opción de fórmula correcta, pero ¿cómo se realizan operaciones básicas bit a bit en una fórmula JMP?
por ejemplo, aquí hay un ejemplo de Python que me gustaría replicar en JMP: lambda x: ((((x>>1)&0x1))<<2)
gracias, ross
Tabla de datosRe: ¿Cómo se realizan operaciones bit a bit en fórmulas JMP?JMP no tiene operadores bit a bit nativos. En tu ejemplo, probaría esto
// untested code for (((x>>1)&0x1))<<2
f = function( { x },
( mod( floor( x / 2 ), 2 ) == 1 ) * 4
}x>>1 (desplazamiento a la derecha 1) divide x por 2, &1 mantiene solo el bit menor (cero/uno, par/impar) y <<2 (desplazamiento a la izquierda 2) multiplica por 4. (Suponiendo que Python funcione como C y no lo he olvidado...)
Si tiene muchos de estos, con posiciones de bits peculiares, etc., es posible que desee buscar una biblioteca de manipulación de bits. El único que conozco está en 7 cosas que debes saber sobre Twitter y puede no ser muy amigable (archivo BITS.jsl en el archivo zip). No recuerdo exactamente lo que hace, pero parece que está resolviendo el problema convirtiendo un número en una cadena de caracteres de 32 unos y ceros, luego combinando las cadenas usando las reglas lógicas AND/OR/etc. Probablemente le faltan operaciones que no eran necesarias. Y estoy bastante seguro de que la función HTTPRequest facilitaría mucho ese código ahora.
Los números negativos pueden ser realmente extraños cuando se hacen los cambios correctos. El bit de signo puede ser un problema.
Re: ¿Cómo se realizan operaciones Bit a bit en fórmulas JMP?mmm...
Agregué una solicitud a la lista de deseos: operaciones de bits JSL
( @jthi ya solicitó en 2020)
Por ahora (Jmp18), ¿cuál es la forma más rápida de extraer los 32 bits de un número de 32 bits?
... por 10 millones de filas?
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: ¿Cómo se realizan operaciones Bit a bit en fórmulas 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 );
Esto mueve la mayor parte del bucle al código C++. Si puedes descubrir cómo hacerlo con una división, podrías acelerarlo un poco más. Es posible que desee utilizar b0 en lugar de b1 para el nombre del bit menos significativo, de modo que su valor sea 2^0==1. Depende de lo que representen los bits.
Re: ¿Cómo se realizan operaciones Bit a bit en fórmulas JMP?Wow asombroso 
Re: ¿Cómo se realizan operaciones Bit a bit en fórmulas JMP?Desarrolladores de JMP:
Por favor, por favor, por favor, agregue operadores bit a bit a JSL. Al analizar archivos de registro con campos de bits (como bits de error, bits de estado, etc.), he tenido muchas ocasiones de utilizar operadores bit a bit. Esta característica también se puede ampliar haciendo que las asignaciones de bits definidas por el usuario sean una opción en las propiedades de la columna (es decir, bit 0 = puerta abierta, bit1 = puerta cerrada, ...) y luego en el generador de gráficos, trazando una única variable de columna con mapa de bits. contra el tiempo, podría mostrar todos los estados de bits invirtiendo.
Re: ¿Cómo se realizan operaciones Bit a bit en fórmulas JMP?Hola @BetaTreeCamel91 , ¿votaste?
Operaciones de bits JSL