Wir können die Nummer 12
als 2r001100
in clojure darstellen.Drucken der binären Wert einer Zahl in clojure
Gibt es eine eingebaute Funktion zum Drucken 2r001100
, wenn die Nummer 12 gegeben?
Wir können die Nummer 12
als 2r001100
in clojure darstellen.Drucken der binären Wert einer Zahl in clojure
Gibt es eine eingebaute Funktion zum Drucken 2r001100
, wenn die Nummer 12 gegeben?
siehe cl-format
user=> (require '[clojure.pprint :refer (cl-format)])
nil
user=> (cl-format nil "2r~6,'0',B" 12)
"2r001100"
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)))
Ah aber Formatierer nicht binär macht .. –
java.lang.Integer/toString drucken Zahlen mit beliebiger radix:
(Integer/toString 0xf2 2) ==> "11110010"
(Integer/toString 0xf2 16) ==> "f2"
(Integer/toString 0xf2 27) ==> "8q"
Viel lesbarer als die CL-Format-Lösung, – ctpenrose
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.
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))))
Das ist großartig, aber die Zweierkomplement Darstellung nicht drucken die Nummer für eine negative Eingabe. – noisesmith