~ (NOT bit a bit) (Transact-SQL)
Lleva a cabo una operación lógica NOT bit a bit en un valor entero.
El operador bit a bit ~ realiza una operación lógica NOT bit a bit para la expression, tomando un bit cada vez. Si expression tiene un valor de 0, los bits en el conjunto de resultados están establecidos en 1; de lo contrario, el bit en el resultado se borra a un valor de 0. En otras palabras, los unos pasan a los ceros y los ceros pasan a unos.
Importante
|
|---|
|
Cuando se realiza cualquier clase de operación bit a bit, es importante la longitud del almacenamiento de la expresión que se utiliza para la operación bit a bit. Se recomienda utilizar el mismo número de bytes al almacenar los valores. Por ejemplo, almacenar el valor decimal 5 como un tinyint, smallint o int produce un valor que se almacena con un número de bytes diferente. tinyint almacena los datos con 1 byte, smallint los almacena con 2 bytes e int, con 4 bytes. De esta forma, realizar una operación bit a bit en un valor decimal int puede producir resultados distintos de los que utilizan una traducción a binario directo o hexadecimal, especialmente cuando se utiliza el operador ~ (NOT bit a bit). La operación NOT bit a bit puede tener lugar en una variable con una longitud menor. En este caso, cuando se convierte a una variable de un tipo de datos más largo, los bits del conjunto de 8 bits superiores no pueden establecerse en el valor previsto. Se recomienda convertir la variable del tipo de datos más pequeño al tipo de datos mayor, y, a continuación, realizar la operación NOT en el resultado. |
En el ejemplo siguiente se crea una tabla con el tipo de datos int para almacenar los valores y se insertan los dos valores en una fila.
USE tempdb; GO IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'bitwise') DROP TABLE bitwise; GO CREATE TABLE bitwise ( a_int_value int NOT NULL, b_int_value int NOT NULL ); GO INSERT bitwise VALUES (170, 75); GO
La consulta siguiente realiza la operación NOT bit a bit en las columnas a_int_value y b_int_value.
USE tempdb; GO SELECT ~ a_int_value, ~ b_int_value FROM bitwise;
El conjunto de resultados es:
--- --- -171 -76 (1 row(s) affected)
La representación binaria de 170 (a_int_value o A) es 0000 0000 1010 1010. Realizar la operación NOT bit a bit en este valor produce el resultado binario 1111 1111 0101 0101 que es el decimal -171. La representación binaria de 75 es 0000 0000 0100 1011. Realizar la operación NOT bit a bit produce 1111 1111 1011 0100, que es el decimal -76.
(~A)
0000 0000 1010 1010
-------------------
1111 1111 0101 0101
(~B)
0000 0000 0100 1011
-------------------
1111 1111 1011 0100
