1 ;;;; bit-operations.test --- bitwise operations on numbers -*- scheme -*-
2 ;;;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
4 ;;;; This library is free software; you can redistribute it and/or
5 ;;;; modify it under the terms of the GNU Lesser General Public
6 ;;;; License as published by the Free Software Foundation; either
7 ;;;; version 2.1 of the License, or (at your option) any later version.
9 ;;;; This library is distributed in the hope that it will be useful,
10 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;;;; Lesser General Public License for more details.
14 ;;;; You should have received a copy of the GNU Lesser General Public
15 ;;;; License along with this library; if not, write to the Free Software
16 ;;;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 (use-modules (ice-9 documentation))
25 (define (run-tests name-proc test-proc arg-sets)
28 (pass-if (apply name-proc arg-set)
29 (apply test-proc arg-set)))
32 (define (documented? object)
33 (not (not (object-documentation object))))
36 (inexact->exact (+ (/ (log (+ most-positive-fixnum 1)) (log 2)) 1)))
38 (define fixnum-min most-negative-fixnum)
39 (define fixnum-max most-positive-fixnum)
41 (with-test-prefix "bit-extract"
43 (pass-if "documented?"
44 (documented? bit-extract))
46 (with-test-prefix "extract from zero"
50 (string-append "single bit " (number->string b)))
52 (= (bit-extract a b c) d))
56 (list 0 (+ fixnum-bit -2) (+ fixnum-bit -1) 0)
57 (list 0 (+ fixnum-bit -1) (+ fixnum-bit 0) 0)
58 (list 0 (+ fixnum-bit 0) (+ fixnum-bit 1) 0)
59 (list 0 (+ fixnum-bit 1) (+ fixnum-bit 2) 0)))
63 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
65 (= (bit-extract a b c) d))
67 (list 0 0 (+ fixnum-bit -1) 0)
68 (list 0 1 (+ fixnum-bit 0) 0)
69 (list 0 2 (+ fixnum-bit 1) 0)
70 (list 0 (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3) 0)
71 (list 0 (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2) 0)
72 (list 0 (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1) 0)
73 (list 0 (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0) 0)))
77 (string-append "fixnum-bit bits starting at " (number->string b)))
79 (= (bit-extract a b c) d))
81 (list 0 0 (+ fixnum-bit 0) 0)
82 (list 0 1 (+ fixnum-bit 1) 0)
83 (list 0 2 (+ fixnum-bit 2) 0)
84 (list 0 (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2) 0)
85 (list 0 (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1) 0)
86 (list 0 (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0) 0)
87 (list 0 (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1) 0)))
91 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
93 (= (bit-extract a b c) d))
95 (list 0 0 (+ fixnum-bit 1) 0)
96 (list 0 1 (+ fixnum-bit 2) 0)
97 (list 0 2 (+ fixnum-bit 3) 0)
98 (list 0 (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1) 0)
99 (list 0 (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0) 0)
100 (list 0 (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1) 0)
101 (list 0 (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2) 0))))
103 (with-test-prefix "extract from fixnum-max"
107 (string-append "single bit " (number->string b)))
109 (= (bit-extract a b c) d))
111 (list fixnum-max 0 1 1)
112 (list fixnum-max 1 2 1)
113 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit -1) 1)
114 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit 0) 0)
115 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit 1) 0)
116 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit 2) 0)))
120 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
122 (= (bit-extract a b c) d))
124 (list fixnum-max 0 (+ fixnum-bit -1) (ash fixnum-max 0))
125 (list fixnum-max 1 (+ fixnum-bit 0) (ash fixnum-max -1))
126 (list fixnum-max 2 (+ fixnum-bit 1) (ash fixnum-max -2))
127 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3) 1)
128 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2) 0)
129 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1) 0)
130 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0) 0)))
134 (string-append "fixnum-bit bits starting at " (number->string b)))
136 (= (bit-extract a b c) d))
138 (list fixnum-max 0 (+ fixnum-bit 0) (ash fixnum-max 0))
139 (list fixnum-max 1 (+ fixnum-bit 1) (ash fixnum-max -1))
140 (list fixnum-max 2 (+ fixnum-bit 2) (ash fixnum-max -2))
141 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2) 1)
142 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1) 0)
143 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0) 0)
144 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1) 0)))
148 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
150 (= (bit-extract a b c) d))
152 (list fixnum-max 0 (+ fixnum-bit 1) (ash fixnum-max 0))
153 (list fixnum-max 1 (+ fixnum-bit 2) (ash fixnum-max -1))
154 (list fixnum-max 2 (+ fixnum-bit 3) (ash fixnum-max -2))
155 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1) 1)
156 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0) 0)
157 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1) 0)
158 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2) 0))))
160 (with-test-prefix "extract from fixnum-max + 1"
164 (string-append "single bit " (number->string b)))
166 (= (bit-extract a b c) d))
168 (list (+ fixnum-max 1) 0 1 0)
169 (list (+ fixnum-max 1) 1 2 0)
170 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit -1) 0)
171 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit 0) 1)
172 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit 1) 0)
173 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit 2) 0)))
177 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
179 (= (bit-extract a b c) d))
181 (list (+ fixnum-max 1) 0 (+ fixnum-bit -1) (ash 0 (- fixnum-bit 1)))
182 (list (+ fixnum-max 1) 1 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 2)))
183 (list (+ fixnum-max 1) 2 (+ fixnum-bit 1) (ash 1 (- fixnum-bit 3)))
184 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3) 2)
185 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2) 1)
186 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1) 0)
187 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0) 0)))
191 (string-append "fixnum-bit bits starting at " (number->string b)))
193 (= (bit-extract a b c) d))
195 (list (+ fixnum-max 1) 0 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 1)))
196 (list (+ fixnum-max 1) 1 (+ fixnum-bit 1) (ash 1 (- fixnum-bit 2)))
197 (list (+ fixnum-max 1) 2 (+ fixnum-bit 2) (ash 1 (- fixnum-bit 3)))
198 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2) 2)
199 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1) 1)
200 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0) 0)
201 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1) 0)))
205 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
207 (= (bit-extract a b c) d))
209 (list (+ fixnum-max 1) 0 (+ fixnum-bit 1) (ash 1 (- fixnum-bit 1)))
210 (list (+ fixnum-max 1) 1 (+ fixnum-bit 2) (ash 1 (- fixnum-bit 2)))
211 (list (+ fixnum-max 1) 2 (+ fixnum-bit 3) (ash 1 (- fixnum-bit 3)))
212 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1) 2)
213 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0) 1)
214 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1) 0)
215 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2) 0))))
217 (with-test-prefix "extract from fixnum-min"
221 (string-append "single bit " (number->string b)))
223 (= (bit-extract a b c) d))
225 (list fixnum-min 0 1 0)
226 (list fixnum-min 1 2 0)
227 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit -1) 0)
228 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit 0) 1)
229 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit 1) 1)
230 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit 2) 1)))
234 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
236 (= (bit-extract a b c) d))
238 (list fixnum-min 0 (+ fixnum-bit -1) (ash 0 (- fixnum-bit 1)))
239 (list fixnum-min 1 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 2)))
240 (list fixnum-min 2 (+ fixnum-bit 1) (ash 3 (- fixnum-bit 3)))
241 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3)
242 (- (ash 1 (- fixnum-bit 1)) 2))
243 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2)
244 (- (ash 1 (- fixnum-bit 1)) 1))
245 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1)
246 (- (ash 1 (- fixnum-bit 1)) 1))
247 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0)
248 (- (ash 1 (- fixnum-bit 1)) 1))))
252 (string-append "fixnum-bit bits starting at " (number->string b)))
254 (= (bit-extract a b c) d))
256 (list fixnum-min 0 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 1)))
257 (list fixnum-min 1 (+ fixnum-bit 1) (ash 3 (- fixnum-bit 2)))
258 (list fixnum-min 2 (+ fixnum-bit 2) (ash 7 (- fixnum-bit 3)))
259 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2)
260 (- (ash 1 fixnum-bit) 2))
261 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1)
262 (- (ash 1 fixnum-bit) 1))
263 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0)
264 (- (ash 1 fixnum-bit) 1))
265 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1)
266 (- (ash 1 fixnum-bit) 1))))
270 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
272 (= (bit-extract a b c) d))
274 (list fixnum-min 0 (+ fixnum-bit 1) (ash 3 (- fixnum-bit 1)))
275 (list fixnum-min 1 (+ fixnum-bit 2) (ash 7 (- fixnum-bit 2)))
276 (list fixnum-min 2 (+ fixnum-bit 3) (ash 15 (- fixnum-bit 3)))
277 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1)
278 (- (ash 1 (+ fixnum-bit 1)) 2))
279 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0)
280 (- (ash 1 (+ fixnum-bit 1)) 1))
281 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1)
282 (- (ash 1 (+ fixnum-bit 1)) 1))
283 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2)
284 (- (ash 1 (+ fixnum-bit 1)) 1)))))
286 (with-test-prefix "extract from fixnum-min - 1"
290 (string-append "single bit " (number->string b)))
292 (= (bit-extract a b c) d))
294 (list (- fixnum-min 1) 0 1 1)
295 (list (- fixnum-min 1) 1 2 1)
296 (list (- fixnum-min 1) (+ fixnum-bit -2) (+ fixnum-bit -1) 1)
297 (list (- fixnum-min 1) (+ fixnum-bit -1) (+ fixnum-bit 0) 0)
298 (list (- fixnum-min 1) (+ fixnum-bit 0) (+ fixnum-bit 1) 1)
299 (list (- fixnum-min 1) (+ fixnum-bit 1) (+ fixnum-bit 2) 1)))
303 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
305 (= (bit-extract a b c) d))
307 (list (- fixnum-min 1) 0 (+ fixnum-bit -1)
308 (- (ash 1 (- fixnum-bit 1)) 1 (ash 0 (- fixnum-bit 1))))
309 (list (- fixnum-min 1) 1 (+ fixnum-bit 0)
310 (- (ash 1 (- fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 2))))
311 (list (- fixnum-min 1) 2 (+ fixnum-bit 1)
312 (- (ash 1 (- fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 3))))
313 (list (- fixnum-min 1) (+ fixnum-bit -2)
314 (+ fixnum-bit fixnum-bit -3) (- (ash 1 (- fixnum-bit 1)) 3))
315 (list (- fixnum-min 1) (+ fixnum-bit -1)
316 (+ fixnum-bit fixnum-bit -2) (- (ash 1 (- fixnum-bit 1)) 2))
317 (list (- fixnum-min 1) (+ fixnum-bit 0)
318 (+ fixnum-bit fixnum-bit -1) (- (ash 1 (- fixnum-bit 1)) 1))
319 (list (- fixnum-min 1) (+ fixnum-bit 1)
320 (+ fixnum-bit fixnum-bit 0) (- (ash 1 (- fixnum-bit 1)) 1))))
324 (string-append "fixnum-bit bits starting at " (number->string b)))
326 (= (bit-extract a b c) d))
328 (list (- fixnum-min 1) 0 (+ fixnum-bit 0)
329 (- (ash 1 fixnum-bit) 1 (ash 1 (- fixnum-bit 1))))
330 (list (- fixnum-min 1) 1 (+ fixnum-bit 1)
331 (- (ash 1 fixnum-bit) 1 (ash 1 (- fixnum-bit 2))))
332 (list (- fixnum-min 1) 2 (+ fixnum-bit 2)
333 (- (ash 1 fixnum-bit) 1 (ash 1 (- fixnum-bit 3))))
334 (list (- fixnum-min 1) (+ fixnum-bit -2)
335 (+ fixnum-bit fixnum-bit -2) (- (ash 1 fixnum-bit) 3))
336 (list (- fixnum-min 1) (+ fixnum-bit -1)
337 (+ fixnum-bit fixnum-bit -1) (- (ash 1 fixnum-bit) 2))
338 (list (- fixnum-min 1) (+ fixnum-bit 0)
339 (+ fixnum-bit fixnum-bit 0) (- (ash 1 fixnum-bit) 1))
340 (list (- fixnum-min 1) (+ fixnum-bit 1)
341 (+ fixnum-bit fixnum-bit 1) (- (ash 1 fixnum-bit) 1))))
345 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
347 (= (bit-extract a b c) d))
349 (list (- fixnum-min 1) 0 (+ fixnum-bit 1)
350 (- (ash 1 (+ fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 1))))
351 (list (- fixnum-min 1) 1 (+ fixnum-bit 2)
352 (- (ash 1 (+ fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 2))))
353 (list (- fixnum-min 1) 2 (+ fixnum-bit 3)
354 (- (ash 1 (+ fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 3))))
355 (list (- fixnum-min 1) (+ fixnum-bit -2)
356 (+ fixnum-bit fixnum-bit -1) (- (ash 1 (+ fixnum-bit 1)) 3))
357 (list (- fixnum-min 1) (+ fixnum-bit -1)
358 (+ fixnum-bit fixnum-bit 0) (- (ash 1 (+ fixnum-bit 1)) 2))
359 (list (- fixnum-min 1) (+ fixnum-bit 0)
360 (+ fixnum-bit fixnum-bit 1) (- (ash 1 (+ fixnum-bit 1)) 1))
361 (list (- fixnum-min 1) (+ fixnum-bit 1)
362 (+ fixnum-bit fixnum-bit 2) (- (ash 1 (+ fixnum-bit 1)) 1))))))