Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Toán học Ruby thiết yếu: Modulo, Binary, Bitmasking & More

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.

Toán học Ruby thiết yếu: Modulo, Binary, Bitmasking & More

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!