Bitwise operations
The bitwise operations AND
, XOR
and OR
are available using the bitwise()
module
from the Cairo common library.
bitwise_and(x, y)
, the result of bitwise AND operation on x and y.bitwise_xor(x, y)
, the result of bitwise XOR operation on x and y.bitwise_or(x, y)
, the result of bitwise OR operation on x and y.
All three operations may also be obtained with the bitwise_operations(x, y)
function.
%builtins bitwise
from starkware.cairo.common.cairo_builtins import BitwiseBuiltin
from starkware.cairo.common.bitwise import (bitwise_operations,
bitwise_and, bitwise_xor, bitwise_or)
func main{bitwise_ptr: BitwiseBuiltin*}() -> ():
# Define two binary numbers, a and b,
# using powers of 2 representation.
# Binary: a = 1100.
let a = 1 * 2**3 + 1 * 2**2 + 0 * 2**1 + 0 * 2**0
assert a = 1 * 8 + 1 * 4 + 0 * 2 + 0 * 1
assert a = 12 # Decimal representation.
# Binary: b = 1010.
let b = 1 * 2**3 + 0 * 2**2 + 1 * 2**1 + 0 * 2**0
assert b = 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1
assert b = 10 # Decimal representation.
# 1100 AND 1010 = 1000.
let (a_and_b) = bitwise_and(a, b)
assert a_and_b = 1 * 2**3 + 0 * 2**2 + 0 * 2**1 + 0 * 2**0
# 1100 XOR 1010 = 0110.
let (a_xor_b) = bitwise_xor(a, b)
assert a_xor_b = 0 * 2**3 + 1 * 2**2 + 1 * 2**1 + 0 * 2**0
# 1100 OR 1010 = 1110.
let (a_or_b) = bitwise_or(a, b)
assert a_or_b = 1 * 2**3 + 1 * 2**2 + 1 * 2**1 + 0 * 2**0
# User defined values x and y. Returns all three operations.
let (and, xor, or) = bitwise_operations(a, b)
# Check that they match the result above.
assert and = a_and_b
assert xor = a_xor_b
assert or = a_or_b
# Bitwise operations must be less than 251-bit.
# let (c) = bitwise_or(2**251, 2**3) # Fails.
let (c) = bitwise_or(2**250, 2**3)
assert c = 2**250 + 2**3
return ()
end
Save as program.cairo
Compile and run
Note that the bitwise builtin requires the all
layout.
cairo-compile program.cairo --output=compiled_program.json
cairo-run --program=compiled_program.json \
--program_input=input.json --print_output --layout=all
StarkNet
Cairo programs may use bitwise operations and below is a preview of how an equivalent StarkNet contract would look once they are enabled.
%lang starknet
%builtins bitwise
from starkware.cairo.common.cairo_builtins import BitwiseBuiltin
from starkware.cairo.common.bitwise import (bitwise_operations,
bitwise_and, bitwise_xor, bitwise_or)
@view
func check_bitwise{bitwise_ptr: BitwiseBuiltin*}() -> ():
# Define two binary numbers, a and b,
# using powers of 2 representation.
# Binary: a = 1100.
let a = 1 * 2**3 + 1 * 2**2 + 0 * 2**1 + 0 * 2**0
assert a = 1 * 8 + 1 * 4 + 0 * 2 + 0 * 1
assert a = 12 # Decimal representation.
# Binary: b = 1010.
let b = 1 * 2**3 + 0 * 2**2 + 1 * 2**1 + 0 * 2**0
assert b = 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1
assert b = 10 # Decimal representation.
# 1100 AND 1010 = 1000.
let (a_and_b) = bitwise_and(a, b)
assert a_and_b = 1 * 2**3 + 0 * 2**2 + 0 * 2**1 + 0 * 2**0
# 1100 XOR 1010 = 0110.
let (a_xor_b) = bitwise_xor(a, b)
assert a_xor_b = 0 * 2**3 + 1 * 2**2 + 1 * 2**1 + 0 * 2**0
# 1100 OR 1010 = 1110.
let (a_or_b) = bitwise_or(a, b)
assert a_or_b = 1 * 2**3 + 1 * 2**2 + 1 * 2**1 + 0 * 2**0
# User defined values x and y. Returns all three operations.
let (and, xor, or) = bitwise_operations(a, b)
# Check that they match the result above.
assert and = a_and_b
assert xor = a_xor_b
assert or = a_or_b
# Bitwise operations must be less than 251-bit.
# let (c) = bitwise_or(2**251, 2**3) # Fails.
let (c) = bitwise_or(2**250, 2**3)
assert c = 2**250 + 2**3
return ()
end
Save as bitwise.cairo
. Compilation will be enabled in the future.