java to the rescue! Thanks to all for your suggestions
Scott On Mar 13, 3:45 pm, Michał Marczyk <michal.marc...@gmail.com> wrote: > On 12 March 2010 23:26, Scott <sbuck...@gmail.com> wrote: > > > How do I write a function 'bit' that converts an integer to binary > > representation: > > > (bit 0) -> 2r0 > > (bit 1) -> 2r1 > > (bit 2) -> 2r10 > > (bit 3) -> 2r11 > > I understand that you want a way to obtain a string representation of > a number in binary. I think you need to dispatch on class: > > (Integer/toBinaryString (int 5)) ; => "101" > (Integer/toBinaryString (Integer. 5)) => "101" > (Long/toBinaryString (long 5)) ; => "101" > (Long/toBinaryString (Long. (long 5))) ; => "101" > > (.toString (bigint 5) 2) ; the "2" indicates the radix; => "101" > (.toString (BigInteger. "5") 2) ; => "101" > > As far as I can tell, you can't use the int/long method with bigints > or the other way around. > > If you'd like to add the "2r" in front, just use str: > > (str "2r" "101") ; => "2r101" > > > As well, as function 'bit-concat' with the following behavior: > > > (bit-concat 2r1 2r00) -> 2r100 > > (bit-concat 2r0 2r00) -> 2r000 > > (bit-concat 2r011 2r1100) -> 2r0111100 > > I'd prefer to have bit-concat operate on actual numbers, not on > strings; you can convert the result later. To that end, here's a > possible solution (I'm *sure* there must be a better way... but it > works): > > (let [ls (zipmap (map #(loop [n % r 1] > (if (zero? n) > r > (recur (dec n) (* 2 r)))) > (range 0 128)) > (map inc (range 0 128)))] > (defn bit-length [n] > (if (zero? n) > 0 > (condp = (class n) > Integer (ls (Integer/highestOneBit n)) > Long (ls (Long/highestOneBit n)) > BigInteger (.bitLength n))))) > > (comment > ; this returns true > (every? #(== (bit-length %) (.bitLength %)) > (map bigint (range 0 1000)))) > > (defn bit-concat [n m] > (bit-or (bit-shift-left n (bit-length m)) > m)) > > This will work as expected unless you use unboxed ints: > > user> (bit-shift-left (int 1) 63) > -2147483648 > user> (bit-shift-left (Integer. 1) 63) > 9223372036854775808 > user> (bit-shift-left (long 1) 128) > 340282366920938463463374607431768211456 > user> (bit-shift-left (long 1) 200) > 1606938044258990275541962092341162602522202993782792835301376 > user> (class (bit-shift-left (long 1) 200)) > java.math.BigInteger > > Sincerely, > Michał -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en