---- Bulent Murtezaoglu <[EMAIL PROTECTED]> demiş ki:
> (defun make-set-converter (set)
> (let* ((set-size (length set))
> (set-array (make-array set-size :initial-contents set)))
> (compile nil
> `(lambda (num)
> (declare
> (optimize (speed 3) (debug 0) (safety 0)))
> (loop for i fixnum from 0 below ,set-size
> for bits of-type (unsigned-byte ,set-size) = num then (ash
> bits -1)
> when (oddp bits) collect (svref ,set-array i))))))
>
>
> CL-USER> (defvar set100 (loop for i from 1 to 100 collect i))
> SET100
> CL-USER> set100
> (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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
> 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100)
> CL-USER> (defvar hizli-conv)
> HIZLI-CONV
> CL-USER> (setf hizli-conv (make-set-converter set100))
> ;;temizlik
> #<FUNCTION {B256BCD}>
> CL-USER> (format t "~b~%" 31337357)
> 1110111100010101110001110
> CL-USER> (set-converter 31337357 set100)
> (1 3 4 8 9 10 12 14 18 19 20 21 23 24 25)
> CL-USER> (funcall hizli-conv 31337357)
> (1 3 4 8 9 10 12 14 18 19 20 21 23 24 25)
> CL-USER> (time (dotimes (i 10000) (set-converter 31337357 set100)))
Bitleri sayı kümesi ile eşleştirmek gerçekten süper bir fikir! Böylece, biraz
çaba ile, işlemcinin bitwise operatörlerdeki yeteneğinden de yararlanabiliriz.
Çok teşekkürler hocam. Ben bunu biraz daha kurcalayım.
Bu arada bu yöntemin genel bir adı var mı? Hani wikipedia'da daha ayrıntılı bir
şeyler bulabileceğimiz şekilde...
İyi çalışmalar.
_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp