Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
добрый день, помогите разобраться.
мне необходимо в SQL-запросе реализовать следующую структуру
Delphi код:
Format('{%.4x-%.4x-%.4x-%.4x-000000000000}', [Val1 shr 16, Val1 and $FFFF, Val2 shr 16, Val2 and $FFFF]);
то ли голова кругом, толи лыжи не едут

до чего я дошел
SHR - логический сдвиг вправо. насколько я понял это можно заменить банальным делением на 16 с последующим округлением до целого:
ROUND(Val1 / 16, 0)
c Val1 and $FFFF тоже вроде все прозрачно: Val1 & 0xFFFF
итого строка в SQL-запросе
SQL код:
'{' + CAST(ROUND(Val1/16, 0) AS NVARCHAR(4)) + '-' + CAST(Val1&0xFFFF AS NVARCHAR(4)) + '-' + CAST(ROUND(Val2/16, 0) AS NVARCHAR(4)) + '-' + CAST(Val2&0xFFFF AS NVARCHAR(4)) + '-000000000000}'

но вот только итог не похож на то, что возвращает дельфи (Val1 = 15084, Val2 = 1)
{0-1-942-15084-000000000000} - в SQL Server
{0000-0001-0000-3AEC-000000000000} - Delphi

Подскажите, что я делаю не так?
15 авг 13, 17:09    [14714522]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
bayazet
что я делаю не так?

Вы всерьёз полагаете, что сдвиг на 16 битов вправо (Val1 shr 16) эквивалентен делению на 16 (ROUND(Val2/16, 0))?
15 авг 13, 17:16    [14714559]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
ffhj
Guest
bayazet,

v shr 5 = val / 2^5
15 авг 13, 17:16    [14714566]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
bayazet,

Val2 shr 16 - это разве не сдвиг на 16 бит?
Тогда делить надо приблизительно на 216, а?
15 авг 13, 17:16    [14714567]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
bayazet,

и если Вы везде NVARCHAR пишете, то у остальных строк букву N не забывайте.

Да! И тут принято окружать текст на SQL тегом SRC
15 авг 13, 17:18    [14714580]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
dfghвап
Guest
iap,

как вы запилили степень над двойкой? шрифт имеется ввиду.
15 авг 13, 17:19    [14714586]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
dfghвап
iap,

как вы запилили степень над двойкой? шрифт имеется ввиду.
SUP
15 авг 13, 17:20    [14714592]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
dfghвап,

на "цитировать" у моего сообщения нажмите - всё станет ясно
15 авг 13, 17:21    [14714605]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
bayazet
Подскажите, что я делаю не так?

Вам integer нужно отобразить как шестнадцатиричное число да еще с разбивкой что ли ?
15 авг 13, 17:21    [14714606]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
dfhuj
Guest
iap
bayazet,

Val2 shr 16 - это разве не сдвиг на 16 бит?
Тогда делить надо приблизительно на 216, а?


а можно я еще тут спрошу? как люди в теге src подсвечивают текст? когда бьют пяткой в грудь и пытаются показать момэнт... сколоко не пользовался [color] не получается. тег посимвольно отображается и все.
15 авг 13, 17:26    [14714637]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
значит, насколько я понял, надо делать так?
SELECT 
'{' + RIGHT(REPLICATE('0', 4) + CAST(ROUND(Val1/(2^16),0) AS NVARCHAR(10)), 4) + '-' + RIGHT(REPLICATE('0', 4) + CAST(Val1&0xFFFF AS NVARCHAR(10)), 4) + '-' + RIGHT(REPLICATE('0', 4) + CAST(ROUND(Val2/(2^16), 0) AS NVARCHAR(10)), 4) + '-' + RIGHT(REPLICATE('0', 4) + CAST(Val2&0xFFFF AS NVARCHAR(10)), 4) + '-000000000000}', 


все равно не похоже:
{0000-0001-0838-5084-000000000000} против {0000-0001-0000-3AEC-000000000000}
15 авг 13, 17:28    [14714654]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
dfhuj,

бью пяткой в грудь
пытаюсь показать момэнт

Жмите "цитировать" и увидите :)
15 авг 13, 17:28    [14714660]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
dfhuj
iap
bayazet,

Val2 shr 16 - это разве не сдвиг на 16 бит?
Тогда делить надо приблизительно на 216, а?


а можно я еще тут спрошу? как люди в теге src подсвечивают текст? когда бьют пяткой в грудь и пытаются показать момэнт... сколоко не пользовался [color] не получается. тег посимвольно отображается и все.

https://www.sql.ru/faq/faq_topic.aspx?fid=202
15 авг 13, 17:29    [14714665]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
dfhuj
iap
bayazet,

Val2 shr 16 - это разве не сдвиг на 16 бит?
Тогда делить надо приблизительно на 216, а?


а можно я еще тут спрошу? как люди в теге src подсвечивают текст? когда бьют пяткой в грудь и пытаются показать момэнт... сколоко не пользовался [color] не получается. тег посимвольно отображается и все.


да уж сразу все секреты откроем, чего там:
https://www.sql.ru/faq/faq_topic.aspx?fid=202
15 авг 13, 17:29    [14714666]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
bayazet
значит, насколько я понял, надо делать так?

Какая _задача_ то ?
15 авг 13, 17:30    [14714669]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
Glory
Вам integer нужно отобразить как шестнадцатиричное число да еще с разбивкой что ли ?

это некая вариация на тему гуида. Задача стоит его формировать именно так, чтобы потом можно было вычленить Val1 и Val2
15 авг 13, 17:30    [14714670]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
bayazet
значит, насколько я понял, надо делать так?
2^16

Символ "крышки" в MSSQL означает "исключающее или".
Напишите лучше 65536.
15 авг 13, 17:30    [14714672]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
Glory, задача реализовать в SQL-запросе формат строки из дельфи
Format('{%.4x-%.4x-%.4x-%.4x-000000000000}', [Val1 shr 16, Val1 and $FFFF, Val2 shr 16, Val2 and $FFFF]); 
15 авг 13, 17:33    [14714690]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
bayazet
Glory, задача реализовать в SQL-запросе формат строки из дельфи

Офигеть
Т.е. надо быстренько узнать, что там в дельфи делает Format вообще и этот конкретно ?
15 авг 13, 17:35    [14714709]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
Glory, я приводил пример, что считает дельфи в корне топика. сейчас у меня получается получить запросом
{0000-0001-0000-5084-000000000000}, а нужно {0000-0001-0000-3AEC-000000000000}
очевидно, что 0001 и 5084 нужно перевести в шестнадцатиричный вид, причем не 0хNNNN, а в достаточно классический вид шестнадцатиричного числа
15 авг 13, 17:39    [14714741]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
bayazet
Glory, я приводил пример, что считает дельфи в корне топика. сейчас у меня получается получить запросом
{0000-0001-0000-5084-000000000000}, а нужно {0000-0001-0000-3AEC-000000000000}
очевидно, что 0001 и 5084 нужно перевести в шестнадцатиричный вид, причем не 0хNNNN, а в достаточно классический вид шестнадцатиричного числа

Что вы все про дельфи ?
Здесь форум по MSSQL
Что хранится в поле таблицы ?
15 авг 13, 17:41    [14714757]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
откройте калькулятор (calc.exe) в научном режиме и переведите сами 5084 в HEX. сами увидите, что значение никак не равно 3AEC.

что там дельфи считает?
15 авг 13, 17:42    [14714764]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
Konst_One, 3AEC это (15084 and $FFFF)
а 3АЕС я получаю как RIGHT(REPLICATE('0', 4) + CAST(15084 & 0xFFFF AS NVARCHAR(10)), 4)
15 авг 13, 17:45    [14714786]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
bayazet
Member

Откуда:
Сообщений: 42
блин, прошу прощения! (не нашел как редактировать сообщение)
5084 я получаю как RIGHT(REPLICATE('0', 4) + CAST(15084 & 0xFFFF AS NVARCHAR(10)), 4)
15 авг 13, 17:46    [14714795]     Ответить | Цитировать Сообщить модератору
 Re: сдвиги и 16-тиричные числа в SQL Server 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
bayazet
а 3АЕС я получаю как RIGHT(REPLICATE('0', 4) + CAST(15084 & 0xFFFF AS NVARCHAR(10)), 4)

И поэтому integer должен автоматически преобразоваться в hex что ли ?
15 авг 13, 17:46    [14714796]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить