2016-05-26 2 views
3

Может ли кто-нибудь объяснить, что делает этот запрос?SQL Integer и знак '&'

SELECT (Convert(int, 33558529) & 4096),((Convert(int, 33558529) & 1048576)) 
FROM dbo.example 

Почему первая часть возвращает 4096, а вторая часть возвращает 0?

+5

& является логическим «и» операция побитового. Это поведение задокументировано в MSDN: https://msdn.microsoft.com/en-GB/library/ms174965.aspx?f=255&MSPPError=-2147217396 – PulseLab

+0

что вы хотите получить от этого запроса? Здесь, если вы введете 1048577 вместо 1048576, то он вернет 1. –

ответ

2

& знак T-SQL - bitwise AND. Он используется для побитового сравнения чисел.

Почему первая часть возвращает 4096, а вторая часть возвращает 0?

Потому что большое количество (33558529) содержит бит 4096 бит, но не содержит бит 1048576.

Мне легче понять, когда вы используете меньшие числа и записываете его в двоичном формате. Предположим, что большое число вы проверяете на самом деле 9, записывается в виде двоичного 9

8 4 2 1 
======= 
1 0 0 1 <-- 9 

Если мы должны были выполнить побитовое И логику выше с номером 8 мы получим

8 4 2 1 
======= 
1 0 0 1 <-- 9 
1 0 0 0 <-- 8 
------- 
1 0 0 0 < -- result of ANDing 9 & 8 = 8 

If мы сделали то же самое упражнение, но с 2

8 4 2 1 
======= 
1 0 0 1 <-- 9 
0 0 1 0 <-- 2 
------- 
0 0 0 0 <-- result of ANDing 9 & 2 = 0 
0

& является побитовое логическое и оператор - Он выполняет операцию 2 целых значения.

Пожалуйста, обратитесь: Ampersand (&) operator in a SQL Server WHERE Clause

SELECT 
(Convert(int, 33558529) & 4096),((Convert(int, 33558529) & 1048576)) 
FROM dbo.example 

Его сравнить битовые данные и выдает результат

Проверьте это link и сравнить значение бита

33558529 - 00000010 00000000 00010000 00000001 
4096  - 00000000 00000000 00010000 00000000 means 1 
1048576 - 00000000 00000000 00000000 00000000 

То же вы проверить логика позади.

3

& выполняет побитовую логическую операцию И между двумя целыми значениями. См. doc.

Вот целые значения преобразуются в двоичный:

33558529 = 10000000000001000000000001 
    4096 =    1000000000000 1 bit match hence 1000000000000 or 4096 
1048576 =  100000000000000000000 0 bit match hence 0