Xin cách chuyển số thập phân có 10 chữ số sang hệ nhị phân

Liên hệ QC

trongtuankt

Thành viên chính thức
Tham gia
18/2/14
Bài viết
69
Được thích
3
Anh chị cho em hỏi: em đang sử dụng excel 2010, khi chuyển số thập phân sang hệ nhị phân (em dùng công thức dec2bin) nhưng chỉ chuyển được các số dưới 510, còn các số lớn hơn thì báo #NUM! (em nghĩ do excel giới hạn khi chuyển về hệ nhị phân không quá 9 số). Vậy không biết có cách nào khắc phục hoặc thay thế không ạ, vì em cần chuyển những hệ thập phân có 9/10 số. Em cảm ơn ạ
 

File đính kèm

Hàm chuyển hệ decimal qua binary.

1634741111913.png

Nếu muốn dùng hàm Excel thì dùng hàm Dec2Hex đổi số sang hệ 16. Sau đó đổi từng ký tự Hex sang 4 bit Binary.
 
cái này em hay chỉ học sinh nè thầy, từ hệ 16 đổi sang nhị phân và từ nhị phân đổi sang 16
Phần chuyển đổi 4-bits <-> 1 character khá đơn giản.
Phần dư mới cần một chút mẹo.

Ví dụ phần dư:
ABCD là 16 bít. Bây giờ muốn nhét vào nhị phân nhiều hơn 16 bít thì sao?
 
cái này em hay chỉ học sinh nè thầy, từ hệ 16 đổi sang nhị phân và từ nhị phân đổi sang 16
Chính bài của chủ thớt còn có một điểm rất quan trọng mà tôi khong rõ người ra bài vô tình hay cố ý.
(theo tôi đoán thì người ra bài chưa đạt đến trình độ "cố ý")

Nếu bạn có dạy học sinh ở trình độ cao thì phần giải thích sau đây sẽ có ích cho bạn:

Con toán 9 chữ số thì rất dễ. Nhưng đến 10 chữ số thì nó có thể bị tràn số (overflow) với dữ liệu số nguyên dạng Long và tất cả các hàm, các toán tử trả về trị Long.

Vì vậy, tuy tôi rất tránh dùng các con toán tính Double (tính dạng Real chậm hơn dang Integer nhiều). Nhưng có những code bắt buộc phải viết như vậy.

Điển hình, ở code bài trên, nếu dữ liệu dạng Long thì tôi có thể viết
Do While n > 0
If n And 1 Then Mid(DecToBin, lngth, 1) = "1" ' số lẻ
lngth = lngth - 1
n = n \ 2
Loop
Phép toán xét bit và phép toán chia số nguyên nhanh nhơn các phép toán số thực nhiều.
Trong khi dữ liệu dạng Double thì bắt buộc phải:
Do While n > 0
tmp = Fix(n / 2#) ' một con toán chia và một hàm Fix (bỏ số thập phân)
If tmp + tmp <> n Then Mid(DecToBin, lngth, 1) = "1" ' số lẻ
lngth = lngth - 1
n = tmp
Loop
Toán tử Mod không thể sử dụng ở đây vì toán tử này trả về trị Long, và chỉ làm việc với trị Long. Lỗi tràn số khi tham số nạp vào lớn hơn 2 tỷ.

Lưu ý: khi làm việc với Double, tất cả những hằng số dạng Double tôi luôn luôn bảo cho VBA biết bằng cách thêm dấu # ngay sau số.
 
Toán tử Mod không thể sử dụng ở đây vì toán tử này trả về trị Long, và chỉ làm việc với trị Long. Lỗi tràn số khi tham số nạp vào lớn hơn 2 tỷ.
Thử =Dec_Bin(999999999999999) không bị tràn số
Mã:
Function Dec_Bin(ByVal iNum As LongLong) As String
  Do
    Dec_Bin = iNum Mod 2 & Dec_Bin
    iNum = Int(iNum / 2)
  Loop Until iNum = 0
End Function
 
Thử =Dec_Bin(999999999999999) không bị tràn số
Mã:
Function Dec_Bin(ByVal iNum As LongLong) As String
  Do
    Dec_Bin = iNum Mod 2 & Dec_Bin
    iNum = Int(iNum / 2)
  Loop Until iNum = 0
End Function
Bạn dùng Long Long. (bài #6 tôi có nói là trên 2 tỷ phải dùng Long Long)
Tôi đoán là khi Mocrosoft ra kiểu Long Long thì họ nới toán tử Mod ra để chấp nhận số lớn hơn Long

Để bảng tính không phải ép kiểu, tôi dùng Double. Tôi bị tràn số với Double.
Và cũng có người khác bị:
https:// bettersolutions .com/vba/numbers/dividing-mod-operator.htm
 
Và cũng có người khác bị
Mã:
Function ahihi(l) As Double
    ahihi = l
    MsgBox "Ok con de:" & l
End Function
Sub kkkk()
    Dim c As Double
    c = 3000000000#
    c = ahihi(c) Mod (ahihi(1 + 1) + 1)
    
End Sub
Bác chạy code trên sẽ thấy điều thú vị, đặc biệt nếu hàm ahihi khai báo trả lại "va ri an" thì còn thú vị hơn.
 
Web KT

Bài viết mới nhất

Back
Top Bottom