반응형
PL/SQL의 시프트 연산자
다음의 대안이 있는지 여부.shift
PL/SQL의 연산자?있어bitand
함수이지만 binary_ integer 형식 인수만 허용합니다.
(아마도 줄에 설정된) 정말 긴 숫자의 낮은/높은 비트를 검사해야 할 경우 어떻게 해야 합니까?
인C
있다<<
그리고.>>
오퍼레이터들.PL/SQL에서 어떻게 구현할 수 있습니까?
다음의 대답은 엔디안 불가지론자가 아니고 제 말은 작은 엔디안 형식에 기초한 것입니다.
인수를 단순히 곱하거나(왼쪽으로 이동) 인수를 2로 나누거나(오른쪽으로 이동) 비트를 x의 거듭제곱으로 이동할 수 있습니다. 여기서 x는 이동할 비트 수입니다. 예를 들어, 숫자(255:111111)의 하위 바이트를 왼쪽으로 이동시켜야 하는 경우 다음 작업을 수행합니다.
select 255 * power(2,16) from dual;
-- the result will be (16711680:111111110000000000000000)
반대로 16711680 16비트 값을 오른쪽으로 이동하려면 다음을 수행합니다.
select 16711680 / power(2,16) from dual;
-- the result will be (255:11111111)
오라클 버전 8부터는 데이터베이스에서 자바 코드를 사용할 수 있습니다.PL/SQL에서는 자바 코드에 대한 래퍼를 정의할 수 있습니다.
PACKAGE BODY JAVA_CODE
IS
function bitshift_left(x in number,
n in number) return number
is language java name 'com.foo.Bitshift(java.lang.Integer,
java.lang.Integer) return java.lang.Integer';
END JAVA_CODE;
자바 코드에서 shift 연산자를 사용할 수 있습니다.약간 서툴기는 하지만 이런 식으로 작동할 수 있습니다.
안타깝게도 Oracle XE에서는 이러한 작업을 수행할 수 없습니다. 이 '무료' 에디션에서는 Java를 지원하지 않기 때문입니다.
여기 저만의 LPAD/RPAD 솔루션이 있습니다.
create or replace function bin_shift_right
( p_bin in varchar2,
p_shift in number default null) return varchar2
is
l_len number;
l_shift number;
begin
l_shift := nvl(p_shift, 1);
l_len := length(p_bin);
if (l_len <= 0) then
return null;
end if;
if (l_shift > l_len) then
l_shift := l_len;
end if;
return lpad(substr(p_bin, 1, l_len - l_shift), l_len, '0');
end bin_shift_right;
create or replace function shright
( p_num in number,
p_shift in number default null) return number
is
begin
if (trunc(p_num) <> p_num OR p_num < 0) then
raise PROGRAM_ERROR;
end if;
return nvl(to_dec(bin_shift_right(to_bin(p_num), p_shift), 2), 0);
end shright;
/
그리고 테스트.
SQL>
SQL> select shright(123) from dual;
SHRIGHT(123)
------------
61
SQL>
SQL> select shright(123, 2) from dual;
SHRIGHT(123,2)
--------------
30
SQL>
SQL> select shright(123, 10) from dual;
SHRIGHT(123,10)
---------------
SQL> /
언급URL : https://stackoverflow.com/questions/776355/shift-operators-in-pl-sql
반응형
'programing' 카테고리의 다른 글
자바스크립트는 해시값으로 페이지를 다시 로드합니다. (0) | 2023.10.03 |
---|---|
jQuery 문자열에서 문자열 제거 (0) | 2023.10.03 |
EFcore를 사용하여 MariaDB에서 자동 증분 int 열 생성 (0) | 2023.10.03 |
Python에서 각 하위 목록의 첫 번째 항목 추출 (0) | 2023.10.03 |
fancy box2 / fancy box는 페이지가 상단으로 점프하게 합니다. (0) | 2023.10.03 |