SQL Server 2008 переменные битовые числа

Используя SQL Server 2008.

Допустим, у меня есть 3 числа для хранения.

  • Первое число - любое 6-битное число
  • Второй - любой 4-битный
  • Третье - это также любое 6-битное число

Например:

declare @firstNumber_6bit  tinyint = 50
declare @secondNumber_4bit tinyint = 7
declare @thirdNumber_6bit  tinyint = 63

Мне нужно сохранить эти 3 числа в переменной 2 byte binary (16 бит). Итак, двоичные значения для примера:

  • 50 is 110010,
  • 7 is 0111
  • 63 is 111111
  • 2 байта для хранения: 11001001 11111111

Таким образом, любая из следующих строк должна хранить эти значения:

declare @my3NumbersIn2Bytes binary(2) = 51711

or

declare @my3NumbersIn2Bytes binary(2) = 0xC9FF

(извините, если я испортил порядок байтов в big / little endian, но дело не в этом).

Сохранение и извлечение этих чисел - тривиальная задача с .net CLR, но я пытаюсь решить ее на чистом T-SQL, а, как мы знаем, в SQL Server нет bit shifting. Я видел много примеров, в которых для решения подобных проблем используются таблицы памяти, но это кажется совершенно излишним для простого сдвига бит ... Я думал, что что-то вроде substring для битов может помочь. Я просто хочу быть уверенным, что нет другого способа решить эту проблему, прежде чем идти по пути излишнего.

Итак, мой вопрос: как наиболее эффективно сохранить эти 3 числа и восстановить их?

Спасибо.-


person Nick    schedule 14.02.2013    source источник


Ответы (1)


declare @firstNumber_6bit  tinyint = 50
declare @secondNumber_4bit tinyint = 7
declare @thirdNumber_6bit  tinyint = 63

declare @my3NumbersIn2Bytes binary(2)

select @my3NumbersIn2Bytes = @firstNumber_6bit*1024 + @secondNumber_4bit *64 + @thirdNumber_6bit
--extract values
select @firstNumber_6bit = @my3NumbersIn2Bytes/1024
select @secondNumber_4bit = (@my3NumbersIn2Bytes%1024)/64
select @thirdNumber_6bit = (@my3NumbersIn2Bytes%1024)%64

select convert(varchar(max), @my3NumbersIn2Bytes, 1) -- just for display
, @firstNumber_6bit
, @secondNumber_4bit
, @thirdNumber_6bit

Демонстрация скрипта SQL

person Daniel    schedule 15.02.2013