Форум: "Прочее";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];
ВнизПодскажите, как работать с битами в Оракле? Найти похожие ветки
← →
data © (2008-06-04 18:07) [0]Пока нашла только ф-цию BITAND - побитный and. Нужен еще либо побитный Or, либо NOT, чего то не могу найти таких функций. Заранее спасибо.
← →
DiamondShark © (2008-06-04 18:18) [1]
> Нужен еще либо побитный Or, либо NOT
Почему "либо"? Or недостаточно, а вот NOT -- вполне.
not(x) = -x - 1
or(x, y) = not(and(not(x), not(y))
← →
Правильный_Вася (2008-06-04 18:19) [2]хоть бы версию написала, что ли
/* преобразование строки байтов в число */
FUNCTION ascii_raw( p_raw IN VARCHAR2 )
RETURN NUMBER DETERMINISTIC;
PRAGMA RESTRICT_REFERENCES( ascii_raw, WNDS, RNDS, WNPS, RNPS );
/* побитовое умножение (конъюнкция) с использованием системных пакетов */
FUNCTION bit_and( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC;
PRAGMA RESTRICT_REFERENCES( bit_and, WNDS, RNDS, WNPS, RNPS );
/* побитовое сложение (дизъюнкция) с использованием системных пакетов */
FUNCTION bit_or( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC;
PRAGMA RESTRICT_REFERENCES( bit_or, WNDS, RNDS, WNPS, RNPS );
/* исключающее ИЛИ с использованием системных пакетов */
FUNCTION bit_xor( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC;
PRAGMA RESTRICT_REFERENCES( bit_xor, WNDS, RNDS, WNPS, RNPS );
/* преобразование числа в строку 16-ых байтов */
FUNCTION raw_ascii( p_dec IN NUMBER )
RETURN RAW DETERMINISTIC;
PRAGMA RESTRICT_REFERENCES( raw_ascii, WNDS, RNDS, WNPS, RNPS );
FUNCTION ascii_raw( p_raw IN VARCHAR2 )
RETURN NUMBER DETERMINISTIC
AS
nLen NUMBER := Length( p_raw );
result NUMBER := 0;
BEGIN
FOR i IN 1..nLen LOOP
result := result * 256 + ASCII( SubStr( p_raw, nLen - i + 1, 1 ) );
END LOOP;
RETURN( result );
END ascii_raw;
---
FUNCTION bit_and( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN ascii_raw( utl_raw.cast_to_varchar2( utl_raw.bit_and( raw_ascii( p_dec1 ),
raw_ascii( p_dec2 ) ) ) );
END bit_and;
---
FUNCTION bit_or( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN ascii_raw( utl_raw.cast_to_varchar2( utl_raw.bit_or( raw_ascii( p_dec1 ),
raw_ascii( p_dec2 ) ) ) );
END bit_or;
---
FUNCTION bit_xor( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN ascii_raw( utl_raw.cast_to_varchar2( utl_raw.bit_xor( raw_ascii( p_dec1 ),
raw_ascii( p_dec2 ) ) ) );
END bit_xor;
---
FUNCTION raw_ascii( p_dec IN NUMBER )
RETURN RAW DETERMINISTIC
AS
nTmp NUMBER := p_dec;
result VARCHAR2( 1999 );
BEGIN
LOOP
result := result || Chr( Mod( nTmp, 256 ) );
nTmp := Trunc( nTmp / 256 );
EXIT WHEN( nTmp = 0 );
END LOOP;
RETURN( utl_raw.cast_to_raw( result ) );
END raw_ascii;
← →
DiamondShark © (2008-06-04 18:19) [3]
> or(x, y) = not(and(not(x), not(y))
or(x, y) = not(and(not(x), not(y)))
← →
Sergey Masloff (2008-06-05 05:22) [4]1. В UTL_RAW есть все варианты для RAW значений
2. "руками" для NUMBER (на самом деле для PLS_INTEGER)
CREATE OR replace FUNCTION bitor( x IN NUMBER, y IN NUMBER )
RETURN NUMBER AS
BEGIN
RETURN x + y - bitand(x,y);
END;
← →
Sergey Masloff (2008-06-05 05:28) [5]Как всегда прочитал только вопрос... уже ж все отвечено раньше...
← →
data © (2008-06-05 14:11) [6]всем спасибо за ответы) разобралась
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c