Битовые целочисленные значения в SQL - PullRequest
0 голосов
/ 01 марта 2012

Использование: SQL Server 2008 R2

Моя цель - взять указанное целое число (n) и выбрать каждую перестановку целых чисел с n битами в 2 столбцах, как показано ниже.

Given: n=4

Output:

ColA  ColB
0     0
0     0
0     0
0     0
1     0
1     0
1     0
1     1
2     0
2     0
2     1
2     0
3     0
3     0
3     1
3     1
...
14    1
14    1
14    1
14    0
15    1
15    1
15    1
15    1

Вывод не , повтор НЕ, необходимо заказывать, что может или не может сделать это проще.Однако мне нужно иметь возможность установить n для любого целого числа ... но ради времени выполнения, допустим, оно будет меньше 10.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Возможно, вы захотите попробовать это:

declare @bits int
set @bits = 4

;with AllTheNumbers as (
    select cast (POWER(2, @Bits) as int) - 1 Number
    union all
    select Number - 1
    from AllTheNumbers
    where Number > 0
),
Bits as (
    select @Bits - 1 Bit
    union all
    select  Bit - 1
    from Bits
    where Bit > 0
)
select *, case when (Number & cast (POWER(2, Bit) as int)) != 0 then 1 else 0 end
from AllTheNumbers cross join Bits
order by Number, Bit desc

AllTheNumbers производит числа от 0 до 2 ^ n-1, Bits производит числа битов от 0 до @Bits - 1, и основная часть соединяет их и вычисляет значение бита для каждой позиции.

0 голосов
/ 01 марта 2012

Дайте мне знать, если это нормально, когда вы говорите «биты», я предполагаю, что вы имеете в виду степени 2 - так что вы можете указать, какую степень 2 вы хотите в выражении set, и он вернет все перестановки.

DECLARE @Bit INT
SET @Bit = 4

;WITH NUMS AS (
SELECT TOP(POWER(2,@Bit)+1)ROW_NUMBER() OVER(ORDER BY sc.name) - 1 [N]
FROM syscolumns sc
)

SELECT n1.N, n2.N
FROM NUMS n1
CROSS JOIN NUMS n2
WHERE (n1.N + n2.N) <= POWER(2,@Bit)
ORDER BY n1.N, n2.N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...