如何在 JMP 公式中执行按位运算?您好,我想这只是一个问题,我没有找到正确的公式选项,但如何在 JMP 公式中执行基本的按位运算?
例如,这是一个我想在 JMP 中复制的 Python 示例: lambda x: ((((x>>1)&0x1))<<2)
谢谢,罗斯
自动化和脚本编写数据存取数据混合和清理实验设计回复:如何在 JMP 公式中执行按位运算?JMP 没有本地按位运算符。 在你的例子中,我会尝试这个
// untested code for (((x>>1)&0x1))<<2
f = function( { x },
( mod( floor( x / 2 ), 2 ) == 1 ) * 4
}x>>1(右移 1)将 x 除以 2,&1 仅保留最低位(零/一,偶/奇),<<2(左移 2)乘以 4。 (假设 python 像 C 一样工作并且我没有忘记......)
如果您有很多这样的库,并且具有特殊的位位置等,您可能需要寻找一个位操作库。 我唯一知道的是关于 Twitter 需要了解的 7 件事并且可能不是很友好(zip 文件中的 BITS.jsl 文件)。 我不记得它到底做了什么,但看起来它是通过将数字转换为 32 个 1 和 0 的字符串,然后使用 AND/OR/等逻辑规则组合字符串来解决问题。 它可能缺少任何不需要的操作。 我非常确定 HTTPRequest 函数现在将使该代码变得更加容易。
进行右移时,负数可能会很奇怪。 符号位可能会带来麻烦。
回复:如何在 JMP 公式中执行按位运算?嗯……
我向愿望清单添加了一个请求: JSL 位操作
( @jthi已在 2020 年提出请求)
现在,(Jmp18),提取 32 位数字的 32 位的最快方法是什么?
... 10 mio 行?
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 );回复:如何在 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 );
这将大部分循环移至 C++ 代码中。如果你能弄清楚如何用一个除法来完成它,你可能会加快速度。您可能希望使用 b0 而不是 b1 作为最低有效位的名称,因此其值为 2^0==1。取决于位代表什么。
回复:如何在 JMP 公式中执行按位运算?哇,太棒了:)
回复:如何在 JMP 公式中执行按位运算?JMP开发人员:
请,请,请,请,请将位运算符添加到 JSL。分析带有位字段(如错误位、状态位等)的日志文件时,我曾多次使用位运算符。还可以通过在列属性中将用户定义的位映射设为选项来扩展此功能(即位 0 = 门打开,位 1 = 门关闭,...),然后在图形生成器中,绘制单个位映射列变量与时间的关系,您可以显示所有位状态的翻转。
回复:如何在 JMP 公式中执行按位运算?你好@BetaTreeCamel91 ,你投票了吗?
JSL 位操作