Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 бинарный сдвиг  [new]
Kirill08
Member

Откуда:
Сообщений: 2
Подскажите, пожалуйста, можно ли реализовать операции битовых сдвигов?
Т.е. имеется поле целого типа, необходимо получить значение, например:
n1 := n >> 16;
29 апр 06, 15:51    [2616827]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
Умножение - деление

левый сдвиг (x,4) = x * 16
правый сдвиг (x, 4) = trunc(x/16)
29 апр 06, 16:12    [2616844]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
Умножение - деление
левый сдвиг (x,4) = x * 16
правый сдвиг (x, 4) = trunc(x/16)

С циклическим несколько сложнее :)
29 апр 06, 16:30    [2616862]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
Kirill08
Member

Откуда:
Сообщений: 2
Спасибо, за ответ
еще один вопрос: как реализовать побитовое отрицание?
1 май 06, 09:27    [2618300]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
Смотрите в сторону
UTL_RAW.BIT_COMPLEMENT

Правда в качестве входного параметра можно пользоваться типом RAW или типом VARCHAR2, в котором данные представлены в шестнадцатиричном виде

select utl_raw.bit_complement ('3') from dual

FC

select utl_raw.bit_complement ('FF') from dual

00

select utl_raw.bit_complement ('1111') from dual

EEEE
1 май 06, 10:33    [2618333]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
UTL_RAW.BIT_COMPLEMENT

Ну и про XOR не забываем (там же).
1 май 06, 11:23    [2618370]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
2andrey_anonymous: По Вашему совету в параллельной ветке , тоже пошел гулять с дочкой. Там меня сначала осенило, а потом улыбнуло :) .
UTL_RAW здесь не нужен.
Инверсия делается вычитанием.

Например для беззнаковых байтов

255 - 1 = 254

255 - 10 = 245

255 - 20 = 235

Естественно,нужно верно подбирать уменьшаемое в зависимости от длины и знака.
1 май 06, 21:41    [2619095]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
Естественно,нужно верно подбирать уменьшаемое в зависимости от длины и знака.

Ну зачем же подбирать?
Когда говорят о битовых операциях, всегда имеют ввиду операции над словами фиксированной длины.
Соответственно, "уменьшаемое" можно посчитать - это 2^n-1, где n - количество двоичных разрядов.

Итого: гулять - полезно :)
1 май 06, 22:26    [2619165]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
andrey_anonymous
dmidek
Естественно,нужно верно подбирать уменьшаемое в зависимости от длины и знака.

Ну зачем же подбирать?
Когда говорят о битовых операциях, всегда имеют ввиду операции над словами фиксированной длины.
Соответственно, "уменьшаемое" можно посчитать - это 2^n-1, где n - количество двоичных разрядов.

Итого: гулять - полезно :)


Конечно, я под "подбирать" это и имел в виду.
Для знаковых чисел диапазон от -2^(n-1) + 1 до 2^(n-1) и там что то вроде
(для байта)

select CASE WHEN :n >= 0 THEN 128 - :n ELSE :n - 127 END
from dual
1 май 06, 23:04    [2619219]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
Для знаковых чисел диапазон от -2^(n-1) + 1 до 2^(n-1) и там что то вроде
(для байта)
select CASE WHEN :n >= 0 THEN 128 - :n ELSE :n - 127 END
from dual

А вот тут мы вступаем на скользкий путь предположений.
Для знаковых целых все будет зависеть от кодировки.
Ваши выкладки справедливы для дополнительной кодровки (да, самая распространенная и удобная. Но никто не отменял ту же прямую...).
1 май 06, 23:26    [2619247]     Ответить | Цитировать Сообщить модератору
 Re: бинарный сдвиг  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
dmidek
andrey_anonymous
dmidek
Естественно,нужно верно подбирать уменьшаемое в зависимости от длины и знака.

Ну зачем же подбирать?
Когда говорят о битовых операциях, всегда имеют ввиду операции над словами фиксированной длины.
Соответственно, "уменьшаемое" можно посчитать - это 2^n-1, где n - количество двоичных разрядов.

Итого: гулять - полезно :)


Конечно, я под "подбирать" это и имел в виду.
Для знаковых чисел диапазон от -2^(n-1) + 1 до 2^(n-1) и там что то вроде
(для байта)

select CASE WHEN :n >= 0 THEN 128 - :n ELSE :n - 127 END
from dual


Чуток перепутал
Диапазон от -2^(n-1) до 2^(n-1) - 1

а CASE

select CASE WHEN :n >= 0 THEN 127 - :n ELSE -128 - :n END
from dual
1 май 06, 23:31    [2619257]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить