如何在 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 位元操作