spec: bitwise operations (bitwise-and/or/xor/not, arithmetic-shift, bit-count, integer-length)

OCaml: land/lor/lxor/lnot/lsl/asr in sx_primitives.ml
JS: & | ^ ~ << >> with Kernighan popcount and Math.clz32 for integer-length
spec/primitives.sx: stdlib.bitwise module with 7 entries
26 tests, 158 assertions, all pass OCaml+JS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-26 19:06:09 +00:00
parent 1ad9d63f1b
commit a8a79dc902
5 changed files with 289 additions and 2 deletions

View File

@@ -805,3 +805,47 @@
:doc "Create a new empty mutable string buffer for O(1) amortised append.")
(define-module :stdlib.coroutines)
(define-module :stdlib.bitwise)
(define-primitive
"bitwise-and"
:params (((a :as number) (b :as number)))
:returns "number"
:doc "Bitwise AND of two integers.")
(define-primitive
"bitwise-or"
:params (((a :as number) (b :as number)))
:returns "number"
:doc "Bitwise OR of two integers.")
(define-primitive
"bitwise-xor"
:params (((a :as number) (b :as number)))
:returns "number"
:doc "Bitwise XOR of two integers.")
(define-primitive
"bitwise-not"
:params ((a :as number))
:returns "number"
:doc "Bitwise NOT (one's complement) of an integer.")
(define-primitive
"arithmetic-shift"
:params (((a :as number) (count :as number)))
:returns "number"
:doc "Arithmetic shift: left if count > 0, right if count < 0.")
(define-primitive
"bit-count"
:params ((a :as number))
:returns "number"
:doc "Count set bits (popcount) in a non-negative integer.")
(define-primitive
"integer-length"
:params ((a :as number))
:returns "number"
:doc "Number of bits needed to represent integer a (excluding sign).")