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ố.