Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

คณิตศาสตร์ Ruby พื้นฐาน: Modulo, Binary, Bitmasking และอื่นๆ

คุณต้องการคณิตศาสตร์เพื่อเป็นโปรแกรมเมอร์ที่ดีไหม?

ขึ้นอยู่กับ!

ถ้าคุณแค่เขียน CRUD apps ตลอดวัน คุณอาจไม่ต้องการคณิตศาสตร์มากหรือเลย

แต่ถ้าคุณอยากทำสิ่งน่าสนใจกว่านั้น เช่น แก้ coding challenges และพร้อมสำหรับ coding interviews การเรียนรู้แนวคิดพื้นฐานบางอย่างจะช่วยได้

วันนี้คุณจะได้เรียนรู้เกี่ยวกับ:

  • ตัวดำเนินการ Modulo (%)
  • ระบบเลข (Number systems)
  • Bitmasking

คุณจะได้เรียนรู้วิธีประยุกต์ใช้แนวคิดเหล่านี้ใน Ruby ดังนั้นนี่จะเป็นคู่มือปฏิบัติ

มาเริ่มกัน!

ตัวดำเนินการ Modulo ใน Ruby

ตัวดำเนินการ Modulo ใน Ruby เป็นแบบนี้:

%

ใช่ เหมือนสัญลักษณ์เปอร์เซ็นต์

มันทำอะไร?

ตัวดำเนินการ modulo ให้คุณ เศษของการหาร สามารถใช้สำหรับสิ่งต่างๆ เช่น ตรวจสอบว่าตัวเลขเป็นคู่หรือคี่

ใช่

ใน Ruby เรามีเมธอด even?/odd?

ตัวอย่าง:

8.even? # true
5.even? # false

แต่ถ้าคุณต้องการตรวจสอบว่าตัวเลขหาร 3 ลงตัวไหม คุณต้องใช้ตัวดำเนินการ modulo

ตัวอย่าง:

9 % 3 == 0 # true

มา探索การใช้งานเพิ่มเติม!

การใช้งาน Modulo Operator อย่างเป็นประโยชน์

คุณสามารถใช้ modulo เพื่อตรวจสอบว่า ตัวเลขหนึ่งหารอีกตัวลงตัว

ตัวเลขหารลงตัวถ้าเศษเป็น 0

ตัวอย่าง:

โจทย์ "FizzBuzz" แบบคลาสสิก ต้องการให้คุณหาว่าตัวเลขหาร 3 หรือ 5 ลงตัว

if n % 3 == 0
  puts "Fizz"
end
if n % 5 == 0
  puts "Buzz"
end

คุณสามารถใช้ตัวดำเนินการ modulo เพื่อทำบางอย่างทุก N ครั้ง

เช่นนี้:

(1..10).select { |n| n % 2 == 0 } # [2, 4, 6, 8, 10]

หรือคุณสามารถใช้เมธอด step:

(2..10).step(2).to_a # [2, 4, 6, 8, 10]

การใช้เมธอด Divmod

การใช้งานอีกอย่างของ modulo operator คือการแปลงนาทีเป็นชั่วโมง + นาทีที่เหลือ

ตัวอย่าง:

เรามี 90 นาที ซึ่งเท่ากับ 1 ชั่วโมง และ 30 นาที

hours, minutes = 90.divmod(60) # [1, 30]

สังเกตเมธอด divmod:

มันทำการหารและ modulo (เศษของการหาร) พร้อมกัน

มีประโยชน์มาก!

การทำความเข้าใจระบบเลข (Number Systems)

ระบบเลขคือวิธีแทนตัวเลข

ในการใช้งานตัวเลขประจำวันของคุณ คุณใช้ ระบบสิบ (decimal system)

0123456789

ระบบเลขประกอบด้วยชุดตัวเลข และบางครั้งตัวอักษรด้วย

ตัวอย่าง:

ระบบสิบหก (hexadecimal) ใช้สัญลักษณ์ทั้งหมด 16 ตัว

0123456789abcdef

นี่คือตาราง ระบบเลขทั่วไป:

ชื่อ จำนวนสัญลักษณ์ สัญลักษณ์
Hexadecimal 16 0123456789abcdef
Decimal 10 0123456789
Octal 8 01234567
Binary 2 01

คุณสามารถแปลงระหว่างระบบเลขใน Ruby ด้วยเมธอด to_s

นี่คือวิธีแปลงจาก ทศนิยม (9) เป็น ฐานสอง (1001):

9.to_s(2) # "1001"

คุณสามารถใช้เมธอด to_i บนสตริงเพื่อแปลงกลับเป็นจำนวนเต็ม

ดังนั้น ถ้าคุณต้องการไปจาก ฐานสิบหก (ff) ไป ทศนิยม (255) คุณทำได้:

"ff".to_i(16) # 255

ที่ 16 คือ "จำนวนสัญลักษณ์" หรือ base สำหรับตัวเลข

Bitmasking คืออะไร?

คุณน่าจะไม่ได้ตื่นทุกวันแล้วคิดว่า...

"เฮ้! ฉันต้อง บรรจุค่าบูลีนเยอะมาก ให้เข้าที่ที่เล็กที่สุดเท่าที่จะเป็นไปได้"

แต่ถ้าวันหนึ่งคุณต้องทำอย่างนั้น...

เทคนิคยอดเยี่ยมที่ช่วยคุณคือ "bitmasking"

ด้วย bitmasking คุณสามารถบรรจุค่าบูลีนเยอะมากเข้าไปในค่าจำนวนเต็มเดี่ยวได้

เป็นไปได้อย่างไร?

ด้วยการ ใช้บิต (bits) เดี่ยวๆ ที่ตัวเลขประกอบไปด้วย

เพราะค่าบูลีนสามารถแทนได้ด้วยบิตเดียว และค่าจำนวนเต็มมี 64 บิต เราจึงสามารถบรรจุค่าบูลีนได้สูงสุด 64 ค่าในตัวเลขเดียว

เราจะใช้ bitwise operators

นี่คือตาราง:

ชื่อ สัญลักษณ์ การใช้งาน
XOR (Exclusive OR) ^ Toggle Bit
AND & Check Bit
NOT ~ Clear Bit
OR | Set Bit

Bitwise operators ทำงานระดับบิต (BIT level) และนั่นคือสิ่งที่เราต้องการ

ตัวอย่างโค้ด:

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

วิธีใช้ BitMasking

ตอนนี้คุณสามารถใช้เมธอด set, clear และ check เพื่อทำงานกับโครงสร้างข้อมูลนี้ คุณอาจอยากกำหนดค่าคงที่เพื่ออธิบายว่าแต่ละค่าหมายถึงอะไร

ตัวอย่าง:

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)

ค่าที่ถูกต้องสำหรับ set รวมถึง 1 และกำลังของ 2 (2,4,8,16,32...), เพื่อหลีกเลี่ยงการเขียนทับบิตอื่น

คณิตศาสตร์ Ruby พื้นฐาน: Modulo, Binary, Bitmasking และอื่นๆ

ถ้าเรามี 64 + 32 + 1 ค่าที่เก็บจะเป็นแบบนี้:

1100001

เมธอดคณิตศาสตร์ใน Ruby

Ruby รวมเมธอดคณิตศาสตร์ built-in ไว้บ้างที่อาจมีประโยชน์

เราได้ครอบคลุม divmod, even? และ odd? แล้ว

เมธอดอื่นๆ รวมถึง:

  • ** / pow (ยกกำลัง)
  • gcd (ตัวหารร่วมมาก)
  • abs (ค่าสัมบูรณ์, ลบเครื่องหมายลบ)
  • round (ปัดเศษเป็นจำนวนเต็มใกล้ที่สุด)
  • floor และ ceil (ปัดลง / ปัดขึ้น)
  • Math.sqrt(n) (รากที่สองของ n)
  • Math.log2(n) (log2 ของ n)
  • digits (แปลงจำนวนเต็มเป็นอาร์เรย์ตัวเลขย้อนกลับ)

ตัวอย่าง:

5 ** 2 # 25
-10.abs # 10
300.digits # [0, 0, 3]

วิดีโอคณิตศาสตร์ใน Ruby

สรุป

คุณได้เรียนรู้เทคนิคคณิตศาสตร์น่าสนใจบ้าง เช่น การใช้ modulo % เพื่อหาเศษของการหาร คุณสามารถใช้เศษเพื่อตรวจสอบว่าตัวเลขหนึ่งหารอีกตัวลงตัวหรือไม่

คุณยังได้เรียนรู้เกี่ยวกับระบบเลข bitmasking และ bitwise operators

อย่าลืมแชร์โพสต์นี้...

และสมัครสมาชิก newsletter RubyGuides หากคุณยังไม่ได้ทำ!