programing

PL/SQL의 시프트 연산자

goodsources 2023. 10. 3. 09:12
반응형

PL/SQL의 시프트 연산자

다음의 대안이 있는지 여부.shiftPL/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

반응형