簡體   English   中英

將二進制字符串轉換為數字

[英]Convert binary string to number

很簡單,但我似乎找不到答案。 我有一個由 1 和 0 組成的字符串,例如"01001010" ——我如何將其解析為一個數字?

使用string-to-number ,它可以選擇接受基數:

(string-to-number "01001010" 2)
;; 74

正如@sds 在評論中所解釋的,如果轉換失敗, string-to-number將返回 0。 這是不幸的,因為返回值 0 也可能意味着解析成功。 我寧願使用這個函數的 Common Lisp 版本cl-parse-integer Hyperspec 中描述了標准函數,而 Emacs Lisp 中的函數略有不同(特別是,沒有輔助返回值):

(cl-parse-integer STRING &key START END RADIX JUNK-ALLOWED)

STRING的子字符串STARTEND解析整數。 STRING可能被空格字符(具有語法' '字符)包圍。 其他非數字字符被視為垃圾。 RADIX是 2 到 36 之間的整數,默認值為 10。如果STARTEND之間的子字符串無法解析為整數,除非JUNK-ALLOWED非零,否則會發出錯誤信號。

(cl-parse-integer "001010" :radix 2)
=> 10

(cl-parse-integer "0" :radix 2)
=> 0

;; exception on parse error
(cl-parse-integer "no" :radix 2)
=> Debugger: (error "Not an integer string: ‘no’")

;; no exception, but nil in case of errors
(cl-parse-integer "no" :radix 2 :junk-allowed t)
=> nil

;; no exception, parse as much as possible
(cl-parse-integer "010no" :radix 2 :junk-allowed t)
=> 2

這個線程有一個elisp 標簽。 因為它也有一個 lisp 標簽,所以我想展示兩個解決方案的標准 Common Lisp 版本。 我只在 LispWorks 上檢查過這些。 如果我的解決方案不是標准的 Common Lisp,也許有人會糾正和改進我的解決方案。

對於解決方案

(string-to-number "01001010" 2)

(cl-parse-integer "001010" :radix 2)

LispWorks 沒有string-to-number並且沒有cl-parse-integer 在 LispWorks 中,您可以使用:

(parse-integer "01001010" :radix 2)

對於解決方案

(read (concat "#2r" STRING))

LispWorks 沒有concat 您可以改用連接 read不適用於 LispWorks 中的字符串。 你必須給read一個流。

在 LispWorks 中,您可以這樣做:

(read (make-string-input-stream (concatenate 'string "#2r" "01001010")))

您還可以使用這樣的格式

(read (make-string-input-stream (format nil "#2r~a" "01001010")))

相比之下,這似乎很笨拙,但 FWIW 你也可以這樣做:

(read (concat "#2r" STRING))

即從字符串中read單個表達式作為二進制數。

如果表達式無效,此方法發出錯誤信號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM