Bạn có cần biết toán học để trở thành lập trình viên giỏi?
Tùy thuộc!
Nếu bạn chỉ viết ứng dụng CRUD cả ngày thì bạn có thể không cần biết nhiều toán học, nếu có.
Nhưng nếu bạn muốn làm điều thú vị hơn, như giải thách thức coding & chuẩn bị cho phỏng vấn coding thì học vài khái niệm cơ bản là hữu ích.
Hôm nay bạn sẽ học về:
- Toán tử modulo (
%) - Hệ thống số (Number systems)
- Bitmasking
Bạn sẽ học cách áp dụng các khái niệm này trong Ruby, nên đây sẽ là hướng dẫn thực tế.
Hãy làm điều này!
Toán tử Modulo trong Ruby
Toán tử modulo trong Ruby trông như sau:
%
Đúng, giống như ký hiệu phần trăm.
Nó làm gì?
Toán tử modulo cho bạn phần dư của phép chia. Điều này có thể dùng cho việc như kiểm tra số chẵn lẻ.
Đúng.
Trong Ruby, chúng ta có phương thức even?/odd?.
Ví dụ:
8.even? # true 5.even? # false
Nhưng nếu bạn muốn kiểm tra số có chia hết cho 3 không, bạn phải dùng toán tử modulo.
Ví dụ:
9 % 3 == 0 # true
Hãy khám phá thêm các cách dùng!
Các cách dùng thực tế cho Toán tử Modulo
Bạn có thể dùng modulo để kiểm tra số có chia hết cho số khác không.
Số chia hết nếu phần dư là 0.
Ví dụ:
Thách thức coding kinh điển "FizzBuzz" muốn bạn tìm ra số có chia hết cho 3 hoặc 5.
if n % 3 == 0 puts "Fizz" end if n % 5 == 0 puts "Buzz" end
Bạn có thể dùng toán tử modulo để làm việc cứ mỗi N lần.
Như thế này:
(1..10).select { |n| n % 2 == 0 } # [2, 4, 6, 8, 10]
Hoặc bạn có thể dùng phương thức step:
(2..10).step(2).to_a # [2, 4, 6, 8, 10]
Sử dụng phương thức Divmod
Một cách dùng khác cho toán tử modulo là chuyển đổi phút thành giờ + phút còn lại.
Ví dụ:
Chúng ta có 90 phút, tương đương 1 giờ & 30 phút.
hours, minutes = 90.divmod(60) # [1, 30]
Chú ý phương thức divmod:
Nó làm phép chia & modulo (phần dư của phép chia) cùng lúc.
Rất hữu ích!
Hiểu về Hệ thống số (Number Systems)
Hệ thống số là cách biểu diễn số.
Trong việc dùng số hàng ngày, bạn dùng hệ thập phân (decimal).
0123456789
Hệ thống số bao gồm tập hợp số & đôi khi ký tự.
Ví dụ:
Hệ thập lục phân (hexadecimal) dùng 16 ký hiệu tổng cộng.
0123456789abcdef
Bảng hệ thống số phổ biến:
| Tên | Số ký hiệu | Ký hiệu |
|---|---|---|
| Hexadecimal | 16 | 0123456789abcdef |
| Decimal | 10 | 0123456789 |
| Octal | 8 | 01234567 |
| Binary | 2 | 01 |
Bạn có thể chuyển đổi giữa hệ thống số trong Ruby với phương thức to_s.
Cách chuyển từ thập phân (9) sang nhị phân (1001):
9.to_s(2) # "1001"
Bạn có thể dùng phương thức to_i trên chuỗi để chuyển ngược về integer.
Vì vậy nếu bạn muốn chuyển từ thập lục phân (ff) sang thập phân (255), bạn làm thế này:
"ff".to_i(16) # 255
Ở đây 16 là "số ký hiệu" hoặc base cho số.
Bitmasking là gì?
Bạn có thể không thức dậy mỗi ngày nghĩ…
"Hey! Tôi cần đóng gói nhiều giá trị boolean vào ít không gian nhất có thể."
Nhưng nếu một ngày bạn cần làm điều đó…
Một kỹ thuật tuyệt vời có thể giúp bạn là "bitmasking".
Với bitmasking, bạn có thể đóng gói nhiều giá trị boolean vào một giá trị integer đơn lẻ.
Làm thế nào điều đó có thể?
Bằng cách sử dụng các bit riêng lẻ mà số được tạo thành.
Bởi vì giá trị boolean có thể được biểu diễn bằng một bit đơn lẻ, và giá trị integer có 64 bit, chúng ta có thể đóng gói lên đến 64 giá trị boolean vào một số đơn lẻ.
Chúng ta sẽ dùng bitwise operators (toán tử bit).
Bảng:
| Tên | Ký hiệu | Dùng |
|---|---|---|
| XOR (Exclusive OR) | ^ | Toggle Bit |
| AND | & | Check Bit |
| NOT | ~ | Clear Bit |
| OR | | | Set Bit |
Toán tử bitwise hoạt động ở cấp độ BIT & đó chính xác là điều chúng ta muốn.
Ví dụ code:
class Bitmask
def initialize
@value = 0
end
def set(bit)
@value |= bit
end
def clear(bit)
@value &= ~bit
end
def check(bit)
(@value & bit) == bit
end
def to_binary
@value.to_s(2)
end
end
bit = Bitmask.new
Cách dùng BitMasking
Bây giờ bạn có thể dùng phương thức set, clear & check để làm việc với cấu trúc dữ liệu này. Bạn cũng có thể muốn định nghĩa hằng số để mô tả ý nghĩa của từng giá trị.
Ví dụ:
class Bitmask ENGINES_ENABLED = 1 CAPTAIN_ABOARD = 2 SHIELDS_UP = 4 # ... rest of code here end bit = Bitmask.new bit.set(Bitmask::ENGINES_ENABLED) bit.check(Bitmask::ENGINES_ENABLED)
Giá trị hợp lệ cho set bao gồm 1 & các lũy thừa của 2 (2,4,8,16,32…), điều này tránh ghi đè các bit khác.

Nếu chúng ta có 64 + 32 + 1, giá trị lưu trữ sẽ trông như sau:
1100001
Các phương thức Toán học Ruby
Ruby bao gồm một vài phương thức toán học built-in có thể hữu ích.
Chúng ta đã đề cập divmod, even? & odd?.
Các phương thức khác bao gồm:
**/pow(lũy thừa)gcd(ước chung lớn nhất)abs(giá trị tuyệt đối, bỏ dấu âm)round(làm tròn đến integer gần nhất)floor&ceil(làm tròn xuống / lên)Math.sqrt(n)(căn bậc hai của n)Math.log2(n)(log2 của n)digits(chuyển integer thành mảng đảo ngược các chữ số)
Ví dụ:
5 ** 2 # 25 -10.abs # 10 300.digits # [0, 0, 3]
Video Toán học trong Ruby
Tóm tắt
Bạn đã học vài thủ thuật toán học thú vị, như dùng modulo % để tìm phần dư của phép chia. Bạn có thể dùng phần dư để kiểm tra số có chia hết cho số khác không.
Bạn cũng đã học về hệ thống số, bitmasking & bitwise operators.
Đừng quên chia sẻ bài viết này…
Và đăng ký newsletter RubyGuides nếu bạn chưa!