powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / msb (most significant bit) на pl/sql есть готовый?
25 сообщений из 87, страница 1 из 4
msb (most significant bit) на pl/sql есть готовый?
    #39999748
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внезапно потребовался алгоритм нахождения most significant bit на pl/sql
Хотелось бы, чтобы он надежно и быстро работал в диапазоне чисел:
0 - 170141183460469231731687303715884105727 (power(2,127)-1)

К сожалению, стандартный Log(2,x) не пригоден к использованию на всем диапазоне,
он быстро перестает различать Log(2,x) и Log(2, x-1), и трюками сорта Round(L,20) это не вылечишь.

Деление в цикле с наращиванием счётчика сразу отбрасываем.

На поверхности сейчас вижу либо явный двоичный поиск в массиве на 126 элементов,
либо его реализацию последовательностью явных If-ов.

Что к этому делу еще можно было бы приспособить, работающего хотя бы за логарифм от максимальной разрядности?
Может кто покажет прямые трюки со значениями utl_raw.cast_from_number.
Наверно что-то понятное и легко проверяемое там можно получать, стартуя с HexToRaw,
но меня пока смущает необходимость приведения числа к строковому представлению в таком варианте...

Что присоветуете, коллеги?
а вдруг где-то в стандартных пакетах стандартная функция зашита...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999751
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msb применительно к какому типу данных?
За логарифм от разрядности - можно, полагаю, делением с двоичным поиском.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999753
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

неотрицательный number, укладывающийся в набор значений до максимального беззнакового 126-битного целого.
(диапазон я указал в первом посте)

Двоичный поиск я вижу..
Сейчас думаю,как понизить его глубину.
Вроде вдвое она должна разделяться в смысле максимального размера массива 63 а не 126,
но пока не сообразил, как это точно выписать.

Мне пока верится, что может найтись что-то чуть умнее/хитрее чем двоичный поиск.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999754
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyДеление в цикле с наращиванием счётчика сразу отбрасываем.

А почему, собственно? Делишь, например, на 65536 пока значение не войдёт в диапазон целого
или хотя бы область определения логарифма.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999759
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
хитрее чем двоичный поиск.
to_char(…, 'fmXXX…') + length + …
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999761
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

понял, 4 деления, на 64-битных значениях Log уже какие-то признаки жизни показывает вроде.
Спасибо. Положил на ум.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999765
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
booby
хитрее чем двоичный поиск.
to_char(…, 'fmXXX…') + length + …

to_char(…, 'fmXXX…') - такого сорта начало мне понятно, дальше что-то про utl_raw.

Что про цену to_char по отношению к логарифму можно сказать?
Как-то to_char меня пока пугает, побаиваюсь я его....
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999770
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
дальше что-то про utl_raw.
Нет.
Код: plsql
1.
length(hex)*4 - case substr(hex,1,1) … 0 … 1 … 2 … 3 end

...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999820
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

над raw код такого типа будет за "константу" отрабатывать, на varchar2 - время length,
например, окажется функцией текущей кодировки бд.

я подумаю.
msb - это фрагмент задачи.
Может быть, внутреннее представление данных в ней целиком и правда разумно будет перевести в raw,
отдавая только конечный результат в виде числа.
Поток входного to_char, мне пока всё равно не нравится.
Но, может быть...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999833
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логарифм...
Есть жеж методы против Кольки Сапрыкина
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare 
--  x number := 10+16+32+100043435;
  x number := 170141183460469231731687303715884105727;
  y integer;
  function r(x integer, n number:=1) return integer is
     offs integer := power(2,n);
     x2 integer := trunc(x - bitand(x, x/offs)+ trunc(x/offs));
  begin
    if n < 7 and x2 <> x then return r(x2,n+1); 
    else return x2;
    end if;
  end;
begin 
  y := r(x/2)+1;
  dbms_output.put_line('Игого: '||y||' (0x'||to_char(y,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')||')');
end;
/
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #39999873
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

вау, красота-то какая.
Пойду глаза промою, а то слепит, аж невмоготу.

Премного благодарен.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000000
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Еще раз спасибо.
И ведь я видел этот вариант в интернете, перед тем как писать, в виде кода на C,
но целиком просклизил мимо него, теперь даже досадно.
В частичное оправдание под капот кладу рядом с твоим, то, что получается после линеаризации и возвращения к "классическому" виду.

Задача почти не встречается, но вдруг кому-то полезным окажется,
поэтому оставил в коде комментарий для итересующихся, как оно работает.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
declare 
--  x number := 10+16+32+100043435;
  x number := power(2,126) + power(2,65)+power(2,33)+power(2,17)+power(2,9)+1; --170141183460469231731687303715884105727; -- 5316911983139663491615228241121378303; -- 170141183460469231731687303715884105727;
  y integer;
  function r(x integer, n number:=1) return integer is
     offs integer :=  power(2,n);
     x2 integer := trunc(x) - bitand(x, x/offs)+ trunc(x/offs);   
  begin
    if n < 7 and x2 <> x then return r(floor(x2),n+1); 
    else return x2;
    end if;
  end;
  ---- линеаризованный вариант
  function r2(px Number) return integer is
     offs Number;
     n_mask Number;
     x Number;
     x2 Number; 
     -- шаг вычисления, удваивающего число единиц от msb вправо
     Procedure step_mask 
     Is
     Begin
      offs := 2*offs; x := x2; n_mask := floor(x/offs);
      x2 := x - bitand(x, n_mask) + n_mask;   -- вычисляет битовый OR           
     End;    
  begin

    offs := 1;
    x2 := Floor(px); -- на моих данных это перестраховка
    -- 
    For i in 1..1
    Loop
      -- 1 (2 соседних к msb bit-ов установлены в 1)
      step_mask(); 
      Exit When x=x2;
      
      -- 2 (4 соседних к msb bit-ов установлены в 1)
      step_mask(); 
      Exit When x=x2;      
      
      -- 3 (8 соседних к msb bit-ов установлены в 1)
      step_mask(); 
      Exit When x=x2;
      
      -- 4 (16 соседних к msb bit-ов установлены в 1)
      step_mask(); 
      Exit When x=x2;      
      
      -- 5 (32 соседних к msb bit-ов установлены в 1)
      step_mask(); 
      Exit When x=x2;      
      
      -- 6 (64 соседних к msb bit-ов установлены в 1)
      step_mask(); 
      Exit When x=x2;      
      
      -- 7 (128 соседних к msb bit-ов установлены в 1)
      step_mask(); 
    End Loop;    
    -- здесь гарантированы все единицы, начиная с msb
    -- переходим в следующий разряд и возвращаем половину
    Return (x2+1)/2;
  end;  
begin 
  y := r(x/2)+1;
  dbms_output.put_line('Игого aa            : '||y||' (0x'||to_char(y,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')||')');
  y := r2(x);
  dbms_output.put_line('Игого bb, спасибо aa: '||y||' (0x'||to_char(y,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')||')');  
end;
/

...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000010
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
слепит, аж невмоготу.

Это от отсутствия bitOr :(
...кстати, я там накосячил с порядками. Рекурсия не n+1, а n*2 плюс поправить кондиции

...а если немного вспомнить алгебру, то можно и чуть попроще...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SQL> 
with s0 as
 (select power(2,127) x from dual
 union all select 258 from dual
 union all select 1 from dual
 union all select 0 from dual
 union all select abs(dbms_random.value(1,170141183460469231731687303715)) from dual
 union all select abs(dbms_random.value(1,170141183460469231731687303715884105727)) from dual
 union all select 170141183460469231731687303715884105727 from dual
 )
, s1 as  (select x, bitand(-x/2-1, -x/4-1) y from s0)
, s2 as  (select x, bitand(y, y/4 - 1) y from s1)
, s8 as  (select x, bitand(y, y/16 - 1) y from s2)
, s16 as (select x, bitand(y, y/256 - 1) y from s8)
, s32 as (select x, bitand(y, y/65536 - 1) y from s16)
, s64 as (select x, bitand(y, y/4294967296 - 1) y from s32)
, s128 as(select x, -(bitand(y, y/18446744073709551616 - 1)) y from s64)
select to_char(x,'fm9999999999999999999999999999999999999999') X_Dec
     , '0x'||to_char(x, 'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  X_Hex
     , to_char(y,'fm9999999999999999999999999999999999999999') MSB_Dec
     , '0x'||to_char(y, 'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  MSB_Hex
     , log(2,y) Msb_pos
from s128
;
 
X_DEC                                     X_HEX                               MSB_DEC                                   MSB_HEX                                MSB_POS
----------------------------------------- ----------------------------------- ----------------------------------------- ----------------------------------- ----------
170141183460469231731687303715884105728   0x80000000000000000000000000000000  170141183460469231731687303715884105728   0x80000000000000000000000000000000         127
258                                       0x102                               256                                       0x100                                        8
1                                         0x1                                 1                                         0x1                                          0
0                                         0x0                                 1                                         0x1                                          0
133443245482288878540034551612            0x1af2daa60c54cd8f9c6662f3c         79228162514264337593543950336             0x1000000000000000000000000                 96
119211094692360684699054379122744794223   0x59af38c12477e5bcb50f833e0ff29c6f  85070591730234615865843651857942052864    0x40000000000000000000000000000000         126
170141183460469231731687303715884105727   0x7fffffffffffffffffffffffffffffff  85070591730234615865843651857942052864    0x40000000000000000000000000000000         126
 
7 rows selected
 
SQL> 
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000015
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а если выбросить из головы глупости и двигать по-нашенски, по-базейски...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
with s0 as
 (select power(2,127) x from dual
 union all select 258 from dual
 union all select 1 from dual
 union all select 0 from dual
 union all select abs(dbms_random.value(1,170141183460469231731687303715)) from dual
 union all select abs(dbms_random.value(1,170141183460469231731687303715884105727)) from dual
 union all select 170141183460469231731687303715884105727 from dual
 )
, powers as  (select power(2,level-1) msb, level-1 msb_pos from dual connect by level < 129)
select to_char(x,'fm9999999999999999999999999999999999999999') X_Dec
     , '0x'||to_char(x, 'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  X_Hex
     , to_char(y,'fm9999999999999999999999999999999999999999') MSB_Dec
     , '0x'||to_char(y, 'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  MSB_Hex
     , Msb_pos
from s0
   , lateral(-- закос под трюк "поиск максимума, не превосходящего N", на этом форуме впервые продемонстрированый коллегой Elic лет... много тому :)
            select msb y, msb_pos from powers where msb<x+1 order by msb desc fetch first 1 row only)
;
 
X_DEC                                     X_HEX                               MSB_DEC                                   MSB_HEX                                MSB_POS
----------------------------------------- ----------------------------------- ----------------------------------------- ----------------------------------- ----------
170141183460469231731687303715884105728   0x80000000000000000000000000000000  170141183460469231731687303715884105728   0x80000000000000000000000000000000         127
258                                       0x102                               256                                       0x100                                        8
1                                         0x1                                 1                                         0x1                                          0
47086713355477066368238054730             0x98253765c2b19b926e696d4a          39614081257132168796771975168             0x800000000000000000000000                  95
108485719561466938268229125408222236127   0x519d96eefd2e32e8825ed710730a4ddf  85070591730234615865843651857942052864    0x40000000000000000000000000000000         126
170141183460469231731687303715884105727   0x7fffffffffffffffffffffffffffffff  85070591730234615865843651857942052864    0x40000000000000000000000000000000         126
 
6 rows selected
 
SQL> 



...на pl/sql аналогично используется ассоциативный массив, но там чуть сложнее - надо бить number на 4 binary_integer, в pl/sql оно 32-битное.
Ну или длинный case сгенерить.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000024
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

как bitor получить я понимал, как и то, почему в нём сначала минус кошерно риовать, а не плюс последний член.
проскользил я мимо того обстоятельства, что между 32 разрядами и 128ю всего два шага алгоритма.

то, что ты сейчас показываешь понятно, но общее число шагов вроде не уменьшает..
может быть, if-ы переставляются.
про хранение поднабора степеней в массиве на небольшое число элементов я может быть посмотрю.

PS
я как раз агрегатный bitor сочиняю.
и msb мне нужен, чтобы корректно обыгрывать случай применения в качестве аналитической функции.
Так что в кишках чистый pl/sql будет.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000028
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

я как раз агрегатный bitor сочиняю.
и msb мне нужен, чтобы корректно обыгрывать случай применения в качестве аналитической функции.
Так что в кишках чистый pl/sql будет.

Ну дык bitor(a,b) - он жеж -bitand(-a-1,-b-1)-1
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000032
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

> Деление в цикле с наращиванием счётчика сразу отбрасываем.

На C это был бы наверное самый быстрый способ (после разбивания по размеру слова архитектуры, по 32/64),
т.к. цикл из двух-трех инструкций повтором в 30-60 выполняется быстрее чем вызов функции и возврат.

Поиск в дереве - это всего 7 сравнений (но 128 бит, считаем как 14 сравнений машинных слов) тоже очень быстро
если машинный код генерится хороший.

Лукап по таблице еще не обсуждали? В сях это коротко и быстро. PL/SQL проверяет индексы, поэтому вряд ли.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// возвращает позицию старшего бита в переменной произвольной длины
// предполагает little-endian архитектуру
// использование:  GetTopBitPosition( &var, sizeof( var ) )
// полагается на массив из 256 элементов, который подсчитывается заранее
// 
inline int GetTopBitPosition( const uchar* p, size_t cbSize ) // cbSize in bytes
{
   assert( cbSize > 0 && !IsBadReadPtr(p, cbSize) );

   for( size_t i = maxSize ; --i && !p[i] )
       ;
   return table256[p[i]]+ i*8;
}



Больше таблица - больше скорость.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000034
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

мне лично bitor(a,b) = a - bitand(a, b) + b

намного приятнее.
Такой я на автомате, с закрытыми глазами и не задумываясь, писать умею.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000038
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
про хранение поднабора степеней в массиве на небольшое число элементов я может быть посмотрю.
Так что в кишках чистый pl/sql будет.


Про BitOr я уже вроде сказал - если делать агрегатку, то зачем следить за msb я не очень понимаю.
Про решение на pl/sql - всё достаточно просто, но ограничения на индексы ассоциативных массивов требуют либо уходить в строку, либо заниматься такой хренотенью:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
declare
x number := 0;  
y number;  
  -- Это разместить на уровне пакета
  type t is table of number index by pls_integer;
  powers t;
  magics t;
  procedure init_powers is
  begin
    for i in 0..30 loop
      powers(power(2,i)-1) := i;
    end loop;
    magics(1) := power(2,120);
    magics(2) := power(2,90);
    magics(3) := power(2,60);
    magics(4) := power(2,30);
    magics(5) := power(2,0);
  end;
  function get_msb(x number) return number is
    lx binary_integer;
    lpow binary_integer;
  begin
    -- Инициализацию можно разместить в секции инициализации пакета
    if powers.count = 0 then init_powers; end if;
    if x <=0 then return 0; end if;
    for i in 1..5 loop
      lx := trunc(x/magics(i));
      lpow := i;
    exit when lx > 0; 
    end loop;
    return (powers.prior(lx)+1)*magics(lpow);
  end;
begin
  for i in 0..128 loop
--    x := power(2,i);
    x := x+power(2,i);
    dbms_output.put_line('    X: '||' (0x'||to_char(x,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')||')');
    y := get_msb(x);
    dbms_output.put_line('Игого: '||' (0x'||to_char(y,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')||')');
  end loop;  
end;
/
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000039
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
andrey_anonymous,
мне лично bitor(a,b) = a - bitand(a, b) + b
намного приятнее.

Ну я бы потестил по производительности.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000042
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

... если делать агрегатку, то зачем следить за msb я не очень понимаю.
...


Если задумывать честное применение в качестве аналитической функции,
то полезно под рукой иметь честный способ частичного извлечения данных устаревшего окна и добавления данных нового без переиницализации состояния агрегата.
Имея годный по скорости msb это можно поддержать.

Правда может состоять в том, что это, на самом деле, всего лишь замедляющее агрегат излишество.
Пока я еще не вполне понимаю, останется поддержка такого сорта кода, или нет в окончательном варианте.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000046
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про "медленную проверку индекса массива".
Ну, эта проверка все равно идет на атрибутах экземпляра типа, так что смертельно медленной она не будет.

И, если уж смерть как хочется, чтобы "как в C по смещению" - извлечение подстроки из raw всегда есть, правда за счет
работы с вызовом функции на стеке.
(Может быть, так я и сделаю счетчик занятых битов в агрегате, пока не знаю еще, пока все это - ковыряния в носу.)
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000047
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Имея годный по скорости msb это можно поддержать.

С ходу что-то не соображу как, было бы интересно при случае взглянуть.
...и вот еще, если данные изначально лежат в raw, то utl_raw умеет и or, и xor и даже complement :)
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000051
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
booby

Имея годный по скорости msb это можно поддержать.

С ходу что-то не соображу как, было бы интересно при случае взглянуть.
...и вот еще, если данные изначально лежат в raw, то utl_raw умеет и or, и xor и даже complement :)


вторую часть вопроса я потенциально держу в голове.
Но тогда либо сам агрегат должен сразу работать с raw, а не с number,
либо откуда-то надо брать тайные знания.
Для number понятные мне продолжения в таком написании стартуют с hextoRaw.
А to_char-у, который тот hex должен получить, я не доверяю в плане производительности.

По первой части: потенциально одни и те же значения могут попадать в агрегат произвольное число раз.
При оговоренной максимальной разрядности думаю держать счетчик попаданий в соответствующий бит счётчика-абака,
Дальше, пока "разряд" абака больше единицы, он уменьшается на единицу, а если равен единице,
то вместе с уменьшением значения в разряде абака, обнуляется бит агрегата.
Для поданного на удаление из агрегата числа работа с ним должна начинаться с msb этого удаляемого числа.

Вот всё.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000057
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
либо откуда-то надо брать тайные знания.

Хранение number в oracle не предполагает его прозрачную конвертацию в бинарное целое и, соответственно, в raw - там банально десятичная степень, а не двоичная - т.е. мантисса не сохраняется при умножении/делении на степени 2.
Потому и написал - "если данные хранятся в raw"
hextoRaw принимает на вход только Hex, т.е. без to_char не обойтись (явно или неявно).
Есть вариант cast_from_number, но он тоже потребует битовых операций - выделить мантиссу, степень, как-то домножить одно на другое но уже в виде целого - затем уже компоновать целевой целочисленный raw.

booby

Для поданного на удаление из агрегата числа работа с ним должна начинаться с msb этого удаляемого числа.

Насколько я понимаю, в описанном варианте достаточно все равно с какого байта браться дерибанить число на биты (дабы вычитать побитовый абак). Если справа и делением - то окончание по достижению 0 и не требуется никакой msb...
Впрочем, хозяин-барин, я не настаиваю :)
...
Рейтинг: 0 / 0
25 сообщений из 87, страница 1 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / msb (most significant bit) на pl/sql есть готовый?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]