Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.04 c
2-1213617117
Igor M.
2008-06-16 15:51
2008.07.20
Помогите с АЛГОРИТМом


2-1214198328
ganda
2008-06-23 09:18
2008.07.20
Class + Memory


1-1195638277
sia
2007-11-21 12:44
2008.07.20
применение свойства Anchors


15-1212656826
андр.
2008-06-05 13:07
2008.07.20
MS SQL 2000 TRANSACTION


8-1182769628
DV
2007-06-25 15:07
2008.07.20
перечисление пинов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский