2014-01-30 4 views

Antwort

11

siehe cl-format

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

Das ist großartig, aber die Zweierkomplement Darstellung nicht drucken die Nummer für eine negative Eingabe. – noisesmith

7

Diese Funktionen generieren und drucken Strings mit java.util.Formatter.

aber sie tun nicht binär, so das Beste, was ich tun konnte, ist:

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

Ah aber Formatierer nicht binär macht .. –

13

java.lang.Integer/toString drucken Zahlen mit beliebiger radix:

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

Viel lesbarer als die CL-Format-Lösung, – ctpenrose

0

Test von Extremen hier mit (bit-shift-left 1 63) oder 1000000000000000000000000000000000000000000000000000000000000000.

Die cl-format Lösung bietet mir einen Integer-Überlauf.

Integer/toBinaryString gibt mir Value out of range for int: -9223372036854775808.

Aber Long/toBinaryString gibt mir die Zeichenfolge, die ich erwartet habe.

3

Alle diese Antworten sind gut, aber beide unterstützen keine Zweierkomplemente für negative Zahlen (cl-Format) oder drucken nicht die richtige Anzahl von Bits aus, basierend auf der Breite der Daten selbst (z , das Aufrufen von Integer/toBinaryString oder Integer/toString auf einem Byte wird nicht das tun, was Sie wollen, besonders für negative Zahlen).

Hier ist eine Lösung, die die genauen Bits der zugrunde liegenden Daten korrekt ausgedruckt werden:

(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)))) 
Verwandte Themen