2010-03-01 41 views
20

Đưa ra danh sách các số thập phân, mỗi số có thể được chuyển đổi thành giá trị thập lục phân tương đương của nó như thế nào và ngược lại?Chuyển đổi số thập phân <-> hex

Ví dụ:

 
(convert2hex 255 64 64); -> (FF 40 40) 
(convert2dec FF 40 40); -> (255 64 64) 

(convert2hex 255 64 64 255 64 64 128) 
(convert2dec FF 40 40 FF 40 40 80) 
+1

là bài tập về nhà này? Những gì tôi sẽ bắt đầu bằng cách làm là hiểu ở mức cao thuật toán để chuyển đổi cơ sở mười thành cơ sở mười sáu, * trước * cố gắng thực hiện điều này trong lisp. –

+3

Không phải bài tập về nhà. Emacs Lisp có lẽ không nằm trên radar của trường nào? :-) Tôi sẽ tưởng tượng rằng khả năng chuyển đổi thực tế có thể ở đâu đó trong Emacs. Nếu tôi chỉ muốn một số được chuyển đổi, tôi có thể sử dụng Calc, chẳng hạn. –

+0

Tôi đã viết lisp trong khi tôi đang ở trường. Gọi Calc có vẻ như quá mức cần thiết, cơ sở chuyển đổi cơ bản không phải là xấu. –

Trả lời

29

Số để Hex:

(format "%X" 255) ;; => "FF" 

Bạn cũng có thể zero-pad giá trị với:

(format "%03X" 255) ;; => "0FF" 

Trường hợp 0 là nhân vật sử dụng cho padding và 3 là số không gian để pad.

Hex chuỗi lên vị trí số

(string-to-number "FF" 16) ;; => 255 

Các 16 có nghĩa là "đọc như cơ sở-16."

+0

đối số '16' được gọi là Radix. – ocodo

15

Nếu bạn chỉ muốn gõ một số thập lục phân thành Emacs, không cần phải gọi string-to-number, chỉ cần sử dụng cú pháp #x đọc:

#xFF 
==> 255 

Bạn cũng có thể sử dụng #b cho nhị phân, #o cho số bát phân, hoặc #36r cho cơ sở 36:

#b10011001 
==> 153 
#o777 
==> 511 
#36rHELLO 
==> 29234652 

Xem section 3.1 Integer Basics trong Emacs Lisp Manual

-2

Bạn cũng có thể thiết lập các biến *print-base* đến 16. Bạn có thể này trên toàn cầu:

(setf *print-base* 16) (print '(10 20 30 40)) => (A 14 1E 28) 

hoặc địa phương:

(let ((*print-base* 16)) (dolist (c '(10 20 30 40)) (print c))) 
=>A 
14 
1E 
28 
NIL 
+0

Tài liệu này ở đâu ?! Tôi biết đó là một điều _Common Lisp_, nhưng tôi không nghĩ rằng nó hoạt động trong Emacs Lisp. – ocodo

+0

Trong Lisp thông thường, nó được ghi lại trên trang. 559 của CLtL. Bạn cũng có thể tìm thấy nó trong HyperSpec http://clhs.lisp.se/Body/v_pr_bas.htm. Tuy nhiên, đối với Emacs Lisp, tôi nghĩ rằng nó có thể không được thực hiện. – Leo

+0

Tôi nghĩ rằng bạn đang thiếu điểm. Đây là câu hỏi dành cho EmacsLisp không CL – ocodo

Các vấn đề liên quan