JMP数式でビット演算を実行するにはどうすればよいですか?こんにちは、これは単に正しい数式オプションが見つからないという問題だと思いますが、JMP数式で基本的なビット演算をどのように実行しますか?
たとえば、JMPで複製したいPythonの例を次に示します。ラムダx:((((x >> 1)&0x1))<< 2)
ありがとう、ロス
データ表Re: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は最小ビット(ゼロ/ 1、偶数/奇数)のみを保持し、<< 2(左シフト2)は4を乗算します。 (PythonがCのように機能し、私が忘れていないことを前提としています...)
特殊なビット位置など、これらがたくさんある場合は、ビット操作ライブラリを探すことをお勧めします。 私が知っているのはTwitterについて知っておくべき7つのことあまり友好的ではないかもしれません(zipファイルのBITS.jslファイル)。 正確には覚えていませんが、数値を32個の1と0の文字列に変換し、AND / OR/etc論理規則を使用して文字列を結合することで問題を解決しているようです。 おそらく、不要な操作が欠落している可能性があります。 そして、HTTPRequest関数によってそのコードがはるかに簡単になると確信しています。
右シフトを行う場合、負の数は本当に奇妙になる可能性があります。 符号ビットが問題になる可能性があります。
Re: JMP 式でビット単位の演算を実行するにはどうすればよいですか?うーん...
リクエストをウィッシュリストに追加しました: JSL ビット操作
( @jthi は2020 年にすでにリクエスト済み)
現時点では (Jmp18)、32 ビット数値の 32 ビットを抽出する最速の方法は何ですか?
...1000 万行分?
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: 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++ コードに移動されます。 1 回の除算でそれを行う方法を理解できれば、もう少し高速化できるかもしれません。最下位ビットの名前に b1 ではなく b0 を使用して、その値が 2^0==1 になるようにすることもできます。ビットが何を表すかによって異なります。
Re: JMP 式でビット単位の演算を実行するにはどうすればよいですか?うわー、素晴らしい 
Re: JMP 数式でビット演算を実行するにはどうすればよいでしょうか?JMP 開発者:
どうか、どうか、どうか、JSL にビット演算子を追加してください。ビット フィールド (エラー ビット、ステータス ビットなど) を含むログ ファイルを分析する際に、ビット演算子を使用する機会が何度もありました。この機能は、列プロパティでユーザー定義のビット マッピングをオプションにすることで拡張することもできます (つまり、ビット 0 = ドアが開いている、ビット 1 = ドアが閉じている、など)。その後、グラフ ビルダーで、1 つのビット マップ列変数を時間に対してプロットすると、すべてのビット状態が反転している様子を表示できます。
Re: JMP 数式でビット演算を実行するにはどうすればよいでしょうか?こんにちは@BetaTreeCamel91 、投票しましたか?
JSL ビット操作