在clojure中打印数字的二进制值

时间:2014-01-30 05:46:11

标签: clojure

我们可以在clojure中将12表示为2r001100

当给出数字12时,是否有内置函数来打印2r001100

5 个答案:

答案 0 :(得分:18)

java.lang.Integer/toString将打印具有任意基数的数字:

(Integer/toString 0xf2 2)  ==> "11110010"
(Integer/toString 0xf2 16) ==> "f2"
(Integer/toString 0xf2 27) ==> "8q"

答案 1 :(得分:11)

请参阅cl-format

user=> (require '[clojure.pprint :refer (cl-format)])
nil
user=> (cl-format nil "2r~6,'0',B" 12)
"2r001100"

答案 2 :(得分:8)

这些函数使用java.util.Formatter生成并打印字符串。

但他们不做二元,所以我能想到的最好的是:

(fn [i] (str "2r" (Integer/toBinaryString i)))

答案 3 :(得分:4)

所有这些答案都很好,但要么不支持负数(cl-format)的二进制补码,要么根据数据本身的宽度不打印正确的位数(例如,在字节上调用Integer / toBinaryString或Integer / toString将无法执行您想要的操作,尤其是负数。)

这是一个能够正确打印基础数据的确切位的解决方案:

(defn print-bits [b]
  (let [class-name (.getName (class b))
        is-byte (= "java.lang.Byte" class-name)
        num-bits (clojure.lang.Reflector/getStaticField class-name "SIZE")
        format-string (str "~" num-bits "'0b")
        bin-str-fn #(clojure.lang.Reflector/invokeStaticMethod
                     (if is-byte "java.lang.Integer" class-name)
                     "toBinaryString"
                     (to-array [%]))
        bit-string (if is-byte
                     (str/join (take-last 8 (bin-str-fn (Byte/toUnsignedInt b))))
                     (bin-str-fn b))]
    (println (str (str/join (repeat (- num-bits (count bit-string)) \0))
                  bit-string))))

答案 4 :(得分:2)

使用(bit-shift-left 1 63)1000000000000000000000000000000000000000000000000000000000000000测试极端情况。

提供的cl-format解决方案给我一个整数溢出。

Integer/toBinaryString给了我Value out of range for int: -9223372036854775808

但是Long/toBinaryString给了我预期的字符串。