Operadores

Los operadores de Solidity permiten realizar operaciones matemáticas, lógicas, de comparación, de asignación entre otras. Comprender estos operadores es fundamental para el desarrollo efectivo de contratos inteligentes.

Aritméticos

OperaciónOperadorDescripción

Suma

+

Suma dos operandos

Resta

-

Resta el segundo operando del primero

Multiplicación

*

Multiplica los operandos

División

/

Divide el numerador por el denominador

Módulo

%

Da como resultado el residuo de una división

Incremento

++

Incrementa un valor entero en uno

Decremento

Reduce un valor entero en uno

Ejemplo

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.13; 
contract OperatorDemo {
	 // Inicializar variables
	 uint16 public first = 10;
	 uint16 public second = 30;
	 // Inicializar una variable con el operador de suma
	 uint public addition  = first + second;
	 // Inicializar una variable con el operador de resta
	 uint public subtraction  = second - first; 
		// Inicializar una variable con una multiplicación
	 uint public multiplication  = first * second;
	 // Inicializar una variable con el cociente de una división
	 uint public division = first / second; 
		// Inicializando una variable con módulo
		uint public modulus = first % second; 
		// Inicializar una variable con un valor reducido en uno
		uint public decrement = --second;
		// Inicializar una variable con un valor incrementado en uno
		uint public increment = ++first; 
}

Relacionales

Utiliza estos operadores para comparar dos valores.

RelaciónOperadorDescripción

Igual

==

Compara si los valores son iguales. Si lo son, devuelve verdadero (true).

Diferente

!=

Compara si los valores son diferentes. Si lo son, devuelve verdadero (true).

Mayor que

>

Determina si el valor de la izquierda es mayor que el de la derecha. Devuelve true si es así.

Menor que

<

Determina si el valor de la izquierda es menor que el de la derecha. Devuelve true si es así.

Mayor o igual que

>=

Determina si el valor de la izquierda es mayor o igual que el de la derecha. Devuelve true si es así.

Menor o igual que

<=

Determina si el valor de la izquierda es menor o igual que el de la derecha. Devuelve true si es así.

Ejemplo

SPDX-License-Identifier: MIT 
pragma solidity ^0.8.13; 
contract OperatorDemo {
		// Inicializar variables
		 uint16 public first = 10;
		 uint16 public second = 30;
	  // Inicializar una variable (bool) con el resultado de una comparación igual  
			bool public equal = first == second; 
		// Inicializar una variable (bool) con el resultado de una comparación diferente 
		 bool public not_equal = first != second;
		// Inicializar una variable (bool) con el resultado de una comparación mayor
		bool public greater = second > first; 
		// Inicializar una variable (bool) con el resultado de una comparación menor
		bool public less = first < second; 
		// Inicializar una variable (bool) con el resultado de una comparación mayor o igual que
		bool public greaterThanEqualTo = second >= first; 
		/// Inicializar una variable (bool) con el resultado de una comparación menor o igual que
		bool public lessThanEqualTo = first <= second; 
}

Lógicos

Combinan condiciones para determinar un valor lógico resultante.

Función lógicaOperadorDescripción

AND

&&

Devuelve verdadero (true) si ambas condiciones son verdaderas y falso (false) si al menos una es falsa.

OR

NOT

!

Devuelve verdadero si la condición no se ha satisfecho.

Ejemplo

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.13; 
contract OperatorDemo { 
		// Inicializar variables
		 bool public first = true; 
		 bool public second = false; 
		// Inicializar una variable con el resultado de un AND
		 bool public and = first&&second; 
		// Inicializar una variable con el resultado de un OR
		 bool public or = first||second;
		// Inicializar una variable con el resultado de un NOT
		 bool public not = !second; 
}

De asignación

Permiten asignar un valor a una variable. Al lado derecho del operador se ubica un valor y al lado izquierdo una variable.

TipoOperadorDescripción

Asignación simple

=

Se asigna el valor de la derecha a la variable a la izquierda del operador.

Asignación suma

+=

Añade el operando de la derecha al de la izquierda, luego asigna el resultado al operando de la izquierda.

Asignación resta

-=

Resta el operando de la derecha al de la izquierda, luego asigna el resultado al operando de la izquierda.

Asignación multiplicación

*=

Multiplica ambos operandos, luego asigna el resultado al operando de la izquierda.

Asignación división

/=

Divide el operando de la izquierda por el de la derecha, luego asigna el resultado al operando de la izquierda.

Asignación módulo

%=

Divide el operando de la izquierda por el de la derecha, luego asigna el residuo al operando de la izquierda.

Ejemplo

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
 contract OperatorDemo {
		// Inicializa variable de estado 
		uint  public first = 10; 
		//Asignación simple
		 function simpleAssignment() public {
		 first = 20; 
			} 
		//Asignación suma
		 function addAssignment() public {
			first += 10; 
			} 
		//Asignación resta
		function substractAssignment() public {
		 first -= 10; 
			}
		 //Asignación multiplicación
		 function multiplyAssignment() public {
		 first *= 5; 
			} 
		 //Asignación división
		function divideAssignment() public {
		 first /= 3;
			} 
		//Asignación módulo
		function modulusAssignment() public {
		 first %= 3; 
			} 
}

Sugerencia: Lleva este ejemplo a Remix y fíjate qué pasa con el valor de **first**cuando ejecutas cada una de las funciones.

Bitwise

Son operadores utilizados para realizar operaciones a nivel de bit.

TipoOperadorDescripción

Bitwise AND

&

Se aplica un operador lógico AND a los operandos enteros a nivel de cada bit.

Bitwise OR

Bitwise XOR

^

Se aplica un operador lógico XOR a los operandos enteros a nivel de cada bit.

Bitwise NOT

~

Se aplica un operador lógico NOT al operando a nivel de cada bit.

Desplazamiento izquierdo

<<

Los bits del primer operando se desplazan hacia la izquierda un número de posiciones indicada por el segundo operando.

Desplazamiento derecho

>>

Los bits del primer operando se desplazan hacia la derecha un número de posiciones indicada por el segundo operando.

Para entender estas funciones veamos unos ejemplos de cómo se hacen operaciones a nivel de bit o binario.

Para expresar un número en binario sólo utilizamos 0 y 1. Cada posición del número binario representa una potencia de 2. Así un 1 en la primera posición de la derecha es 2^0 = 1, en la segunda 2^1 = 2, en la tercera 2^2 = 4, en la cuarta 2^3 = 8, y así sucesivamente.

Supongamos que tenemos dos valores x e y:

x = 12, y = 5, que debemos expresar en binario para hacer operaciones bitwise.

x = 12 = 8 + 4 + 0 + 0 = 1100 (binario)

y = 5 = 0 + 4 + 0 + 1 = 0101 (binario)

Si realizamos la operación AND a nivel de bit tendríamos lo siguiente:

x & y = 0100 = 0 + 4 + 0 + 0 = 4

Si realizamos la operación OR a nivel de bit:

x | y = 1101 = 8 + 4 + 0 + 1 = 13

Si realizamos la operación XOR a nivel de bit, que es uno cuando uno de los operandos es 1:

x ^ y = 1001 = 8 + 0 + 0 + 1 = 9

Si realizamos la operación NOT a x a nivel de bit, lo que implica cambiar los ceros por uno y viceversa:

NOT x = 0011 = 0 + 0 + 2 + 1 = 3

Si desplazamos x hacia la izquierda dos posiciones:

x = 12 = 1100 (binario)

x << 2 = 110000 = 48

Si desplazamos x hacia la derecha dos posiciones:

x = 12 = 1100 (binario)

x >> 2 = 0011 = 3

Ejemplo. Despliega este contrato y prueba si los valores para x = 12, y = 5 coinciden con los resultados anteriores. Prueba con otros valores también.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract BitwiseOps {
    
    function and(uint x, uint y) external pure returns (uint) {
        return x & y;
    }
    function or(uint x, uint y) external pure returns (uint) {
        return x | y;
    }

    function xor(uint x, uint y) external pure returns (uint) {
        return x ^ y;
    }

    function not(uint8 x) external pure returns (uint8) {
        return ~x;
    }

    function shiftLeft(uint x, uint bits) external pure returns (uint) {
        return x << bits;
    }

    function shiftRight(uint x, uint bits) external pure returns (uint) {
        return x >> bits;
    }
}

Condicional

Es un operador ternario que evalúa inicialmente una expresión y ejecuta una acción si es verdadera u otra si es falsa.

El formato del operador ternario es el siguiente:

<condición> ? <si es verdadera> : <si es falsa>

Ejemplo

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Conditional {

    function ternary(uint _x) public pure returns (uint) {
        // Si _x es menor que 10, que la función devuelva 1, sino que devuelva 2
        return _x < 10 ? 1 : 2;
    }
}

Last updated