Bitwise
Bitwise operations involve left shift, right shift, and, or, xor and not.
Left Shift, shl(a, b)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Yul {
function shiftLeft(uint256 num, uint256 bitsToShift) public pure returns (bytes32) {
assembly {
mstore(0x80, shl(bitsToShift, num))
return(0x80, 0x20)
}
}
}
shl(a, b) is a Yul function that takes in two arguments, a, the number of bits b would be shifted by, and b, the number to shift. It returns the new value which is the value returned by running b << a.
Right Shift, shr(a, b)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Yul {
function shiftRight(uint256 num, uint256 bitsToShift) public pure returns (bytes32) {
assembly {
mstore(0x80, shr(bitsToShift, num))
return(0x80, 0x20)
}
}
}
shr(a, b) is a Yul function that takes in two arguments, a, the number of bits b would be shifted by, and b, the number to shift. It returns the new value which is the value returned by running b >> a.
And, and(a, b)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Yul {
function and(uint256 num, uint256 andNum) public pure returns (bytes32) {
assembly {
mstore(0x80, and(num, andNum))
return(0x80, 0x20)
}
}
}
and(a, b) is a Yul function that takes in two numbers as arguments. It returns the new value which is the value returned by running a & b.
Or, or(a, b)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Yul {
function or(uint256 num, uint256 orNum) public pure returns (bytes32) {
assembly {
mstore(0x80, or(num, orNum))
return(0x80, 0x20)
}
}
}
or(a, b) is a Yul function that takes in two numbers as arguments. It returns the new value which is the value returned by running a | b.
Xor, xor(a, b)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Yul {
function xor(uint256 num, uint256 xorNum) public pure returns (bytes32) {
assembly {
mstore(0x80, xor(num, xorNum))
return(0x80, 0x20)
}
}
}
xor(a, b) is a Yul function that takes in two numbers as arguments. It returns the new value which is the value returned by running a ^ b.
Not, not(a)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Yul {
function not(uint256 num) public pure returns (bytes32) {
assembly {
mstore(0x80, not(num))
return(0x80, 0x20)
}
}
}
not(a) is a Yul function that takes in a number as argument. It returns the new value which is the value returned by running ~a.