Library globals

Source bits.nas

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
# SPDX-License-Identifier: GPL-2.0-or-later
#
# NOTE! This copyright does *not* cover user models that use these Nasal
# services by normal function calls - this is merely considered normal
# use of the code, and does *not* fall under the heading of "derived
# work."
#
# Copyright (C) 2008 by mfranz

var bit = [var _ = 1];
for (var i = 1; i < 32; i += 1)
	append(bit, _ += _);


# checks whether bit <b> is set in number <n>
var test = func(n, b) {
	n /= bit[b];
	return int(n) != int(n / 2) * 2;
}


# returns number <n> with bit <b> set
var set = func(n, b) n + !test(n, b) * bit[b];


# returns number <n> with bit <b> cleared
var clear = func(n, b) n - test(n, b) * bit[b];


# returns number <n> with bit <b> toggled
var toggle = func(n, b) test(n, b) ? n - bit[b] : n + bit[b];


# returns number <n> with bit <b> set to value <v>
var switch = func(n, b, v) n - (test(n, b) - !!v) * bit[b];


# returns number <n> as bit string, zero-padded to <len> digits:
#   bits.string(6)     ->       "110"
#   bits.string(6, 8)  ->  "00000110"
var string = func(n, len = 1) {
	var s = "";
	while (n) {
		var v = int(n / 2);
		s = (v + v != n) ~ s;
		n = v;
	}
	for (var i = size(s); i < len; i += 1)
		s = '0' ~ s;
	return s;
}


# returns bit string <s> as number:  bits.value("110")  ->  6
var value = func(s) {
	var n = 0;
	var len = size(s);
	for (var i = 0; i < len; i += 1)
		n += n + (s[i] != `0`);
	return n;
}