我们可以在clojure中将12
表示为2r001100
。
当给出数字12时,是否有内置函数来打印2r001100
答案 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
给了我预期的字符串。