W poprzedniej części Operatory bitowe do wykonywania operacji logicznych w T-SQL cz.I opisane zostały podstawowe operacje bitowe w T-SQL oparte na zmiennych typu bit. Teraz chcę podać przykład wyliczania tego typu operacji dla zmiennych liczbowych np. typu INT. Zasada jest podobna, gdyż na początku liczby trzeba rozpisać na postać binarną, a następnie na podstawie porównywania pojedynczych bitów (tak jak przedstawiono w części pierwszej) należy dopiero stworzyć tablice prawdy i uzyskany w ten sposób wynik binarny przekształcić na postać dziesiętną.

& (Bitwise AND) – logiczna operacja I

SELECT (170&75)
-----------   
10     

(A & B)  
170dec = 0000 0000 1010 1010
75dec  = 0000 0000 0100 1011  
----------------------------  
10dec = 0000 0000 0000 1010 

| (Bitwise OR) – logiczna operacja LUB

SELECT (170|75)
-----------   
235

(A | B)  
170dec = 0000 0000 1010 1010
75dec  = 0000 0000 0100 1011  
----------------------------  
235dec = 0000 0000 1110 1011 

^ (Bitwise Exclusive OR – XOR) – logiczna operacja XOR

SELECT (170^75)
-----------   
225

(A ^ B)  
170dec = 0000 0000 1010 1010
75dec  = 0000 0000 0100 1011  
----------------------------  
225dec =  0000 0000 1110 0001 

~(Bitwise NOT) – logiczna operacja NIE

SELECT ~170,~75
        --- ---   
      -171  -76   

(~170)     
170dec =  0000 0000 1010 1010  
         -------------------  
-171dec= 1111 1111 0101 0101  
(~75)     
75dec  = 0000 0000 0100 1011  
         -------------------  
-76dec=  1111 1111 1011 0100  

No tak, ale skąd się wzięły te liczby ujemne i jak to liczymy ?

W tym przykładzie mamy podane liczby dziesiętne przekonwertowane do postaci binarnej. Ilość bitów (4×4=16) to 16 czyli 2 bajty. Ile zatem wynosi w systemie dziesiętnym wartość 1111 1111 1111 1111 ? To 65353 dec.

No tak to proste takie liczby się zapamiętuje. Popatrzmy dalej w SQL Server mamy na 2 bajtach zapisywany typ smallint.

smallint 	-2^15 (-32,768) to 2^15-1 (32,767) 	2 Bytes

Dwu bajtowy typ smallint przyjmuje zakres od -32,768 do 32,767 czyli przechowuje zarówno liczby ujemne jak i dodatnie. Jak zsumujemy wartości bezwzględne -32,768 i 32,767 to da nam liczbę 65353 czyli 1111 1111 1111 1111,

System U2

System U2 (ang. 2C – Two’s Complement) inaczej kod uzupełnień do dwóch jest przeznaczony do przechowywania liczb całkowitych dodatnich i ujemnych. W języku T-SQL zmienne typu tinyint, smallint, int, bigint używają tego systemu do przechowywania wartości. Żeby można było wykonywać operacje w tym systemie, należy określić na ilu bitach będziemy operować. 

Zakres wartości dla n bitów mieści się w przedziale:

[−2n−1; 2n−1−1]

a więc na szesnastu bitach możemy przechować liczby z zakresu [-32,768 ;32,767].

Wartości wag pozycji w zapisie U2

waga-2n-12n-22n-3 222120
cyfrabn-1bn-2bn-3b2b1b0

Wartość liczby U2 obliczamy w następujący sposób: cyfry mnożymy przez wagi pozycji, na których się znajdują i dodajemy otrzymane iloczyny. Waga bitu znakowego jest ujemna.

gdzie
b – bit, cyfra dwójkowa 0 lub 1
n – liczba bitów w zapisie liczby

Procedura wyznaczania liczby przeciwnej w kodzie U2 to:
1. dokonanie negacji wszystkich bitów zapisu liczby U2.
2. do wyniku dodajemy 1.

Przykład:

Wyznaczyć liczbę przeciwną w kodzie U2 do danej liczby 01101110(U2).

  1. Dokonujemy negacji (zmianę na wartości przeciwne) wszystkich bitów liczby U2:
NOT   01101110
 10010001
  1. Do wyniku negacji dodajemy 1:
 10010001
00000001
 10010010

Liczbą przeciwną do 01101110(U2) jest 10010010(U2).

Aby się o tym przekonać, obliczmy wartości dziesiętne obu liczb:

01101110(U2) = 64 + 32 + 8 + 4 + 2 = 110(10).
10010010(U2) = (-128) + 16 + 2 = (-128) + 18 = (-110)(10).

Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl