Phi: nicer scroll animation for METAR widget
[fg:fgdata.git] / Nasal / bits.nas
1 var bit = [var _ = 1];
2 for (var i = 1; i < 32; i += 1)
3         append(bit, _ += _);
4
5
6 # checks whether bit <b> is set in number <n>
7 var test = func(n, b) {
8         n /= bit[b];
9         return int(n) != int(n / 2) * 2;
10 }
11
12
13 # returns number <n> with bit <b> set
14 var set = func(n, b) n + !test(n, b) * bit[b];
15
16
17 # returns number <n> with bit <b> cleared
18 var clear = func(n, b) n - test(n, b) * bit[b];
19
20
21 # returns number <n> with bit <b> toggled
22 var toggle = func(n, b) test(n, b) ? n - bit[b] : n + bit[b];
23
24
25 # returns number <n> with bit <b> set to value <v>
26 var switch = func(n, b, v) n - (test(n, b) - !!v) * bit[b];
27
28
29 # returns number <n> as bit string, zero-padded to <len> digits:
30 #   bits.string(6)     ->       "110"
31 #   bits.string(6, 8)  ->  "00000110"
32 var string = func(n, len = 1) {
33         var s = "";
34         while (n) {
35                 var v = int(n / 2);
36                 s = (v + v != n) ~ s;
37                 n = v;
38         }
39         for (var i = size(s); i < len; i += 1)
40                 s = '0' ~ s;
41         return s;
42 }
43
44
45 # returns bit string <s> as number:  bits.value("110")  ->  6
46 var value = func(s) {
47         var n = 0;
48         var len = size(s);
49         for (var i = 0; i < len; i += 1)
50                 n += n + (s[i] != `0`);
51         return n;
52 }
53
54