2014-01-30 35 views

回答

11

看到cl-format

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

這是偉大的,但是不能打印的二進制補碼錶示負數輸入。 – noisesmith

7

這些函數使用java.util.Formatter生成和打印字符串。

但他們不這樣做的二進制,所以我可以拿出最好的是:

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

啊,但格式沒有做二進制.. –

13

java.lang.Integer/toString將打印號碼任意基數:極端的

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

比cl-format解決方案更可讀, – ctpenrose

0

測試在這裏,使用(bit-shift-left 1 63),或1000000000000000000000000000000000000000000000000000000000000000

提供的cl-format解決方案給我一個整數溢出。

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

但是Long/toBinaryString給了我期望的字符串。

3

所有這些答案都很好,但要麼不支持二進制補碼的負數(cl-格式),要麼根據數據本身的寬度不會打印出正確的比特數(例如,在一個字節上調用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)))) 
相關問題