Decoding Bitwise Operations
Understanding how bitwise operations affect
XOR
PUSH32 0xaaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8cccccc000a
// 0xaaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8 cccccc 0000
// 0x0000 aaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8 cccccc
PUSH1 0x10
SHR
// 0x0000aaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8 cccccc
// 0x0000000000000000000000000000000000000000000000000000000000 cccccc
PUSH3 0xffffff
AND
// 0x0000000000000000000000000000000000000000000000000000000000 cccccc
// 0x0000000000000000000000000000000000000000000000000000000000 666666
PUSH3 0xaaaaaa
XOR
// 0x0000000000000000000000000000000000000000000000000000000000 666666
// 0x000000000000000000000000000000000000000000000000000000666666 0000
PUSH1 0x10
SHL
// 0xaaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8 cccccc 0000
// 0xaaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8 aaaaaa 0000
PUSH32 0xaaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8cccccc000a
XOR
or
PUSH32 0xaaaa0000000000047b37ef4d76c2366f795fb557e3c15e0607b7d8cccccc000a
DUP1
PUSH1 0xf0
SHR
PUSH2 0xbbbb
XOR
PUSH1 0xf0
SHL
XOR
Single Bit For Booleans
Lets look at PAUSED in AAVE’s library.
// -> SET: `(self.data & mask) | (paused ? 1 : 0 << IS_PAUSED_START_BIT_POSITION(60))`
// 1111
PUSH32 0xAAAA00000000000000000000000000000000000000000000F000000000000000
// 1110
PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFF
AND
// or PUSH32 0x000000000000000000000000000000000000000000000000E000000000000000 for false
// 1111 (true)
PUSH32 0x000000000000000000000000000000000000000000000000F000000000000000
OR
Share this Article