将整数中的所有 32 位转换为 Clojure 中的字符串格式
Get all 32 bits in an Integer into String format In Clojure
我需要将 Clojure 中整数的所有 32 位转换为字符串格式。
当前:(Integer/toBinaryString 10) -> "1010"
需要:(Integer/toBinaryString 10) -> “0000000000001010”
我怎样才能轻松高效地做到这一点?
对于无符号整数,可以直接使用clojure.pprint/cl-format
。此示例将 n
格式化为至少 32 个字符的二进制字符串,并在左侧填充 0
个字符:
(require '[clojure.pprint :as pp])
(defn unsigned-binary-32 [n]
(pp/cl-format nil "~32,'0B" n))
对于有符号整数,还需要多一点:
(defn signed-binary-32 [n]
(unsigned-binary-32 (bit-and n 0xffffffff)))
更新
@leetwinski 提出了一个很好的观点!这是一个更简单的版本(仅适用于正数!):
(defn int->binary-str-32
[arg]
(str/pad-left
(Long/toBinaryString arg) ; convert int to string
32 ; pad width
[=10=] ; pad char
))
(int->binary-str-32 12345) => "00000000000000000011000000111001"
原答案
The Tupelo Library has a function you can use. Here is an example using my favorite template project:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require
[clojure.string :as str]
[tupelo.bits :as bits ]
))
(defn int->binary-str-32
[arg]
(str/join
(mapv bits/bit->char
(take-last 32
(bits/long->bits-unsigned arg)))))
结果:
(int->binary-str-32 5) => "00000000000000000000000000000101"
(int->binary-str-32 Short/MAX_VALUE) => "00000000000000000111111111111111"
(int->binary-str-32 Integer/MAX_VALUE) => "01111111111111111111111111111111"
这仅适用于非负值(负值留作 reader 的练习)。
或者你可以修改original source code.
或者您可以使用经典 java 方法:
user> (clojure.string/replace
(format "%32s" (Long/toBinaryString 12345))
\space [=10=])
;;=> "00000000000000000011000000111001"
我需要将 Clojure 中整数的所有 32 位转换为字符串格式。
当前:(Integer/toBinaryString 10) -> "1010"
需要:(Integer/toBinaryString 10) -> “0000000000001010”
我怎样才能轻松高效地做到这一点?
对于无符号整数,可以直接使用clojure.pprint/cl-format
。此示例将 n
格式化为至少 32 个字符的二进制字符串,并在左侧填充 0
个字符:
(require '[clojure.pprint :as pp])
(defn unsigned-binary-32 [n]
(pp/cl-format nil "~32,'0B" n))
对于有符号整数,还需要多一点:
(defn signed-binary-32 [n]
(unsigned-binary-32 (bit-and n 0xffffffff)))
更新
@leetwinski 提出了一个很好的观点!这是一个更简单的版本(仅适用于正数!):
(defn int->binary-str-32
[arg]
(str/pad-left
(Long/toBinaryString arg) ; convert int to string
32 ; pad width
[=10=] ; pad char
))
(int->binary-str-32 12345) => "00000000000000000011000000111001"
原答案
The Tupelo Library has a function you can use. Here is an example using my favorite template project:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require
[clojure.string :as str]
[tupelo.bits :as bits ]
))
(defn int->binary-str-32
[arg]
(str/join
(mapv bits/bit->char
(take-last 32
(bits/long->bits-unsigned arg)))))
结果:
(int->binary-str-32 5) => "00000000000000000000000000000101"
(int->binary-str-32 Short/MAX_VALUE) => "00000000000000000111111111111111"
(int->binary-str-32 Integer/MAX_VALUE) => "01111111111111111111111111111111"
这仅适用于非负值(负值留作 reader 的练习)。
或者你可以修改original source code.
或者您可以使用经典 java 方法:
user> (clojure.string/replace
(format "%32s" (Long/toBinaryString 12345))
\space [=10=])
;;=> "00000000000000000011000000111001"