2010-11-05 11 views
10

Eventuali duplicati:
What does a caret (^) do in a SQL query?Perché SELECT 2^3 restituisce 1 in SQL Server?

Perché il SELECT 2^3 di ritorno 1 in SQL Server?

che questo era un questione intervista mi sono imbattuto e non poteva ottenere il motivo per cui torna 1.

Dopo googling un po ', ho scoperto che si tratta di un operatore di bit per bit. Ma non riesco ancora a capire perché 1 sia un'uscita.

Ho una conoscenza di base di query, stored procedure e T-SQL. Qualcuno può spiegarmi:

  1. Come ottengo 1 in SELECT 2^3?
  2. Qual è l'uso pratico di tali operatori?

E se v'è un uso pratico, allora quali sono le migliori pratiche durante l'utilizzo di tali operatori

+0

Non so perché, ma 'SELEZIONA POW (2,3)' dovrebbe darvi '8'! – RobertPitt

risposta

23

Perché^è XOR operatore.

tabella di verità per XOR

------- 
|^|1|0| 
------- 
|1|0|1| 
------- 
|0|1|0| 
------- 

In altre parole conseguenza abbiamo ha uno solo quando due bit sono diversi.

1^1 = 0 
1^0 = 1 
0^1 = 1 
0^0 = 0 

per voi caso la sua

binary - decimal 
00010 - 2 
00011 - 3 
----------^
00001 - 1 

più su XOR gate

Uso

Per esempio per mask (bitwise operations) manipolazione o la crittografia.

11
a b a^b 
------- 
0 0 0 
0 1 1 
1 0 1 
1 1 0 

2 0b10 
3 0b11 
-------- 
2^3 0b01 = 1 

Il vero scopo pratico è quello di commutare i bit quando utilizzati come bandiere.

+0

In quali scenari vengono utilizzati e in che modo influiscono sul rendimento di una query, in cui vengono utilizzati e alternative (se presenti) per essi. – Pratik

+0

Vengono utilizzati quando si desidera alternare i bit utilizzati come flag o quando si desidera implementare un algoritmo che li utilizza. Oltre a quelli, puoi ignorarlo. –

2
2 in binary = 10 
3 in binary = 11 
^ bitwise (XOR) 

10 XOR 11 = 01 
01 binary = 1 in decimal 
1

Sembra che sia necessario utilizzare la funzione "alimentazione"? :)

POWER Restituisce il valore dell'espressione data alla potenza specificata.

Sintassi POWER (espressione_numerica, y)

select power(2, 3) 

rendimenti 8 ...

PS: Utilizzando^operatore (e gli altri operatori bitwize) è necessario quando si vuole interpretare alcuni campi numerici come "maschera" i dati ed esegui operazioni usando bit dai numeri.

+1

No, non "seleziona potenza (2, 3)". È "selezionare 2^3". – Pratik

+1

OK allora. Di solito alcuni studenti cercano di usare "^" invece di "potere", quindi suppongo che sia proprio così. :) – Badiboy

6

è l'Bitwise Exclusive OR.

Le tabelle di verità per OR e XOR (OR esclusivo) sono diverse. O significa 'Se uno di questi ingressi è vero, l'output è vero'. XOR significa 'Se uno o l'altro, ma non entrambi gli ingressi sono vere, l'uscita è vera'

tabella

O verità: true o false = false vero o falso = true falso OR true = true vero o vero = true

XOR tabella di verità: falso XOR falso = false true XOR falso = true falso XOR vero = true true XOR vero = false

Così che cosa la query sta facendo è la conversione di ogni inserire in binario, quindi fare un XO R su ogni bit. 2^3:

00000010 (2) 
XOR 
    00000011 (3) 
= 
    00000001 
+0

Ricordo XOR come 'se entrambi gli input sono uguali a false else true' e per OR come' se entrambi gli input sono falsi, quindi false else true';) –