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.