5

ラケットで32ビットワードにパディングされたバイナリを印刷したい。「〜b」については知っていprintfますが、毎回32ビット長になるようにパディングしたいと思います。どうすればよいですか?

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

3 に答える 3

9

Racket5.3.1以降でそれを行うための簡潔な方法は次のとおりです。

Welcome to Racket v5.3.2.3.
-> (require racket/format)
-> (~r 42 #:base 2 #:min-width 32 #:pad-string "0")
"00000000000000000000000000101010"

詳細については、ラケット/フォーマットを参照してください。

古いバージョンのRacketでは、次のことができます。

Welcome to Racket v5.3.
-> (require srfi/13)
-> (string-pad (number->string 42 2) 32 #\0)
"00000000000000000000000000101010"
于 2013-01-30T04:08:12.477 に答える
0

これを行うための簡単で非効率的な方法は次のとおりです。

(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)))
于 2013-01-31T16:45:16.977 に答える
0

さて、私は一緒に解決策を強制しました:

(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桁ごとにスペースが含まれる文字列を返します。これは、他の方法で読み取るのが実際にはかなり困難だったためです。

于 2013-01-30T03:56:10.047 に答える