【问题标题】:Print a padded binary word in Racket在 Racket 中打印一个填充的二进制字
【发布时间】:2013-02-01 02:34:00
【问题描述】:

我想在 Racket 中以二进制形式打印一个填充到 32 位的字。我知道printf 和“~b”,但我希望它每次填充为 32 位长。我该怎么做呢?

例子

(printf "~b" 42) 
=> 101010
Want: 00000000000000000000000000101010

【问题讨论】:

    标签: racket


    【解决方案1】:

    以下是使用 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"
    

    【讨论】:

    • 拥有 printf 风格的格式字符串还是很不错的,所以你可以直接说 (sprintf "%032b" 42),因为这样更简洁。 ;-) 赢得胜利的 DSL;例如,这就是我们使用正则表达式的原因。
    • 天哪,我的学校只有 v5.3。那是行不通的……好吧。
    【解决方案2】:

    好吧,我强加了一个解决方案:

    (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 位之间有空格的字符串,因为实际上很难以另一种方式阅读。

    【讨论】:

      【解决方案3】:

      这里有一个简单但低效的方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        相关资源
        最近更新 更多