คุณต้องการคณิตศาสตร์เพื่อเป็นโปรแกรมเมอร์ที่ดีไหม?
ขึ้นอยู่กับ!
ถ้าคุณแค่เขียน 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...), เพื่อหลีกเลี่ยงการเขียนทับบิตอื่น

ถ้าเรามี 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 หากคุณยังไม่ได้ทำ!