【发布时间】:2013-02-01 02:34:00
【问题描述】:
我想在 Racket 中以二进制形式打印一个填充到 32 位的字。我知道printf 和“~b”,但我希望它每次填充为 32 位长。我该怎么做呢?
例子
(printf "~b" 42)
=> 101010
Want: 00000000000000000000000000101010
【问题讨论】:
标签: racket
我想在 Racket 中以二进制形式打印一个填充到 32 位的字。我知道printf 和“~b”,但我希望它每次填充为 32 位长。我该怎么做呢?
例子
(printf "~b" 42)
=> 101010
Want: 00000000000000000000000000101010
【问题讨论】:
标签: racket
以下是使用 Racket 5.3.1 及更高版本的简洁方法:
Welcome to Racket v5.3.2.3.
-> (require racket/format)
-> (~r 42 #:base 2 #:min-width 32 #:pad-string "0")
"00000000000000000000000000101010"
更多详情请见racket/format。
在较旧的 Racket 版本中,您可以这样做:
Welcome to Racket v5.3.
-> (require srfi/13)
-> (string-pad (number->string 42 2) 32 #\0)
"00000000000000000000000000101010"
【讨论】:
(sprintf "%032b" 42),因为这样更简洁。 ;-) 赢得胜利的 DSL;例如,这就是我们使用正则表达式的原因。
好吧,我强加了一个解决方案:
(define (print-word x)
(if (not (<= -2147483648 x 4294967295))
(error 'print-word "ERROR This number is bigger than a word ~a" x)
(let* ([positive-x (if (< x 0) (+ #x100000000 x)
x)]
[str (number->string positive-x 2)]
[padded-str (string-append
(make-string (- 32 (string-length str)) #\0)
str)])
(build-string 39
(λ(i) (cond [(= (remainder (+ 1 i) 5) 0) #\space]
[else (string-ref padded-str (- i (quotient i 5)))]))))))
这实际上返回了每 4 位之间有空格的字符串,因为实际上很难以另一种方式阅读。
【讨论】:
这里有一个简单但低效的方法:
(define (pad-left length padding the-str)
(if (> length (string-length the-str))
(pad-left length padding (string-append padding the-str))
the-str))
(write (pad-left 32 "0" (format "~b" 42)))
【讨论】: