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은 최소 비트(0/1, 짝수/홀수)만 유지하고 <<2(왼쪽 시프트 2)는 4를 곱합니다. (파이썬이 C처럼 작동한다고 가정하고 잊지 않았습니다 ...)
특이한 비트 위치 등을 가진 이러한 항목이 많이 있는 경우 비트 조작 라이브러리를 찾고 싶을 수 있습니다. 내가 아는 유일한 사람은 트위터에 대해 알아야 할 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++ 코드로 이동됩니다. 한 번의 분할로 수행하는 방법을 알아낼 수 있다면 속도를 좀 더 높일 수 있습니다. 최하위 비트 이름으로 b1 대신 b0을 사용하여 해당 값이 2^0==1이 되도록 할 수 있습니다. 비트가 무엇을 나타내는지에 따라 다릅니다.
Re: JMP 공식에서 비트 단위 연산을 어떻게 수행합니까?와, 좋아요 
Re: JMP 공식에서 비트 단위 연산을 어떻게 수행합니까?JMP 개발자:
제발, 제발, 제발, JSL에 비트 연산자를 추가해주세요. 비트 필드(예: 오류 비트, 상태 비트 등)를 사용하여 로그 파일을 분석하면서 비트 연산자를 활용할 기회가 너무 많았습니다. 이 기능은 사용자 정의 비트 매핑을 열 속성의 옵션으로 만든 다음(비트 0 = 문 열림, 비트1 = 문 닫힘 등) 그래프 빌더에서 단일 비트 매핑 열 변수를 플로팅하여 확장할 수도 있습니다. 시간이 지남에 따라 모든 비트 상태가 반전되는 것을 보여줄 수 있습니다.
Re: JMP 공식에서 비트 단위 연산을 어떻게 수행합니까?안녕하세요 @BetaTreeCamel91 님 , 투표 하셨나요?
JSL 비트 연산