将整数中的所有 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"