2016-05-26 11 views
3

誰かが以下のクエリが実際に何をしているのか説明できますか?SQL Integerと '&'記号

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

なぜ最初の部分が4096を返し、2番目の部分が0を返しますか?

+5

ザ・論理「と」ビット演算である:ここ

バイナリに変換する整数値です。それはMSDNで文書化されています。https://msdn.microsoft.com/en-GB/library/ms174965.aspx?f=255&MSPPError=-2147217396 – PulseLab

+0

このクエリから何を取得しますか?ここで1048576の代わりに1048577と入力すると、1が返されます。 –

答えて

2

T-SQLの&記号は、bitwise ANDです。数値のビット単位の比較に使用されます。

なぜ最初の部分は4096を返し、2番目の部分は0を返しますか?

大きな数字(33558529)には4096ビットが含まれていますが、1048576ビットは含まれていないためです。


小さい数字を使用すると理解しやすくなり、バイナリで書き出すことができます。我々は

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

の場合になるだろう数8で上記にビット単位のANDロジックを実行した場合、あなたがチェックしている大きな数が9バイナリとして書かれ、実際に9

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

されていると仮定私たちは、同じ運動をしましたが、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

&と論理演算子ビット単位である - それは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

&は、2つの整数値の間でビット単位の論理AND演算を実行します。 docを参照してください。

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