Python "bitlib"

Admin User, erstellt 18. Dez. 2023
         
###
# Modern Albufeira Prolog Interpreter
#
# Warranty & Liability
# To the extent permitted by applicable law and unless explicitly
# otherwise agreed upon, XLOG Technologies AG makes no warranties
# regarding the provided information. XLOG Technologies AG assumes
# no liability that any problems might be solved with the information
# provided by XLOG Technologies AG.
#
# Rights & License
# All industrial property rights regarding the information - copyright
# and patent rights in particular - are the sole property of XLOG
# Technologies AG. If the company was not the originator of some
# excerpts, XLOG Technologies AG has at least obtained the right to
# reproduce, change and translate the information.
#
# Reproduction is restricted to the whole unaltered document. Reproduction
# of the information is only allowed for non-commercial uses. Selling,
# giving away or letting of the execution of the library is prohibited.
# The library can be distributed as part of your applications and libraries
# for execution provided this comment remains unchanged.
#
# Restrictions
# Only to be distributed with programs that add significant and primary
# functionality to the library. Not to be distributed with additional
# software intended to replace any components of the library.
#
# Trademarks
# Jekejeke is a registered trademark of XLOG Technologies AG.
##
import random
from __main__ import (add, make_arithmetic, deref, exec_build,
make_check, exec_unify, exec_eval, check_integer,
make_error, Compound)
def test_random(args):
alpha = random.random()
return exec_unify(args[0], alpha)
def arit_msb(args):
alpha = exec_eval(args[0])
check_integer(alpha)
return (~alpha if alpha < 0 else alpha).bit_length() - 1
def arit_lsb(args):
alpha = exec_eval(args[0])
check_integer(alpha)
return (alpha & -alpha).bit_length() - 1
def test_testbit(args):
alpha = deref(exec_build(args[0]))
check_integer(alpha)
beta = deref(exec_build(args[1]))
check_integer(beta)
if beta < 0:
raise make_error(Compound("domain_error",
["not_less_than_zero", beta]))
return (alpha & (1 << beta)) != 0
def test_divmod(args):
alpha = deref(exec_build(args[0]))
check_integer(alpha)
beta = deref(exec_build(args[1]))
check_integer(beta)
(divres, modres) = divmod(alpha, beta)
if not exec_unify(args[2], divres):
return False
return exec_unify(args[3], modres)
def main():
add("random", 1, make_check(test_random))
add("msb", 2, make_arithmetic(arit_msb))
add("lsb", 2, make_arithmetic(arit_lsb))
add("testbit", 2, make_check(test_testbit))
add("divmod", 4, make_check(test_divmod))