diff --git a/doc/manual/expressions/builtins.xml b/doc/manual/expressions/builtins.xml
index ac1fe7e2f..5489fab00 100644
--- a/doc/manual/expressions/builtins.xml
+++ b/doc/manual/expressions/builtins.xml
@@ -92,6 +92,36 @@ available as builtins.derivation.
+ builtins.bitAnd
+ e1 e2
+
+ Return the bitwise AND of the integers
+ e1 and
+ e2.
+
+
+
+
+ builtins.bitOr
+ e1 e2
+
+ Return the bitwise OR of the integers
+ e1 and
+ e2.
+
+
+
+
+ builtins.bitXor
+ e1 e2
+
+ Return the bitwise XOR of the integers
+ e1 and
+ e2.
+
+
+
+
builtins
The set builtins contains all
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 57dc7bd12..9dab8ecb0 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1676,6 +1676,20 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value &
}
}
+static void prim_bitAnd(EvalState & state, const Pos & pos, Value * * args, Value & v)
+{
+ mkInt(v, state.forceInt(*args[0], pos) & state.forceInt(*args[1], pos));
+}
+
+static void prim_bitOr(EvalState & state, const Pos & pos, Value * * args, Value & v)
+{
+ mkInt(v, state.forceInt(*args[0], pos) | state.forceInt(*args[1], pos));
+}
+
+static void prim_bitXor(EvalState & state, const Pos & pos, Value * * args, Value & v)
+{
+ mkInt(v, state.forceInt(*args[0], pos) ^ state.forceInt(*args[1], pos));
+}
static void prim_lessThan(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
@@ -2221,6 +2235,9 @@ void EvalState::createBaseEnv()
addPrimOp("__sub", 2, prim_sub);
addPrimOp("__mul", 2, prim_mul);
addPrimOp("__div", 2, prim_div);
+ addPrimOp("__bitAnd", 2, prim_bitAnd);
+ addPrimOp("__bitOr", 2, prim_bitOr);
+ addPrimOp("__bitXor", 2, prim_bitXor);
addPrimOp("__lessThan", 2, prim_lessThan);
// String manipulation
diff --git a/tests/lang/eval-okay-arithmetic.exp b/tests/lang/eval-okay-arithmetic.exp
index b195055b7..5c54d10b7 100644
--- a/tests/lang/eval-okay-arithmetic.exp
+++ b/tests/lang/eval-okay-arithmetic.exp
@@ -1 +1 @@
-2188
+2216
diff --git a/tests/lang/eval-okay-arithmetic.nix b/tests/lang/eval-okay-arithmetic.nix
index bbbbc4691..7e9e6a0b6 100644
--- a/tests/lang/eval-okay-arithmetic.nix
+++ b/tests/lang/eval-okay-arithmetic.nix
@@ -26,6 +26,10 @@ let {
(56088 / 123 / 2)
(3 + 4 * const 5 0 - 6 / id 2)
+ (builtins.bitAnd 12 10) # 0b1100 & 0b1010 = 8
+ (builtins.bitOr 12 10) # 0b1100 | 0b1010 = 14
+ (builtins.bitXor 12 10) # 0b1100 ^ 0b1010 = 6
+
(if 3 < 7 then 1 else err)
(if 7 < 3 then err else 1)
(if 3 < 3 then err else 1)