notes.dt.in.th

จากคำถามในกลุ่มสมาคมโปรแกรมเมอร์ไทย:

พวก Bitwise operations ในภาษา javascript นี่ได้ใช้กันบ่อยมากไหมคะ พวกเครื่องหมาย & | >> << ~ อะไรพวกนี้อะค่ะ

รู้สึกว่าเวลาเขียนเว็บแล้วแทบไม่ค่อยได้ใช้เลย อยากรู้ว่าในสถานการณ์ไหนถึงจะจำเป็นต้องใช้พวกนี้หรอคะ แล้วแต่ละคำสั่ง มันมีไว้ทำอะไรบ้างหรอคะ (อย่างถ้าเป็นภาษาอื่นที่มัน low-level กว่านี้ เข้าใจว่าอาจจะมีใช้เพื่อด้าน performance แต่กับ js นี่มองไม่เห็นภาพเลยค่ะ)

  1. เอาไว้ทำ bit-field เอาไว้เก็บข้อมูล boolean flag หลายๆ ตัว เช่น a = [true, true, false, true, false, false, true, false] ก็เก็บเป็นเลข a = 107 (= 0b01101011 อ่านจากขวามาซ้าย) ตัวเดียวพอ เวลาอ่านค่า a[i] ก็ใช้ (a & (1 << i)) ตัวอย่างที่เห็นก็มี Discord API ที่ใช้ bit-field ค่อนข้างเยอะ

  2. (~x) จะเป็น falsy ถ้า x == -1 และ truthy ถ้าเป็นค่าอื่น ก็จะสามารถเขียน if (~a.indexOf(b)) แทน if (a.indexOf(b) !== -1) ปัจจุบัน string กับ array มี .includes() แล้ว ท่านี้เลยไม่ต้องใช้อีกต่อไป แต่อาจจะยังเห็นอยู่บ้างในโค้ดเก่าๆ

  3. (~~x) เอาไว้ใช้ตัดจุดทศนิยมออกจากตัวเลข ก็คือ สามารถเขียน ~~(a / b) แทน Math.floor(a / b) ได้ (ตัวอย่างเช่น 1 + ~~(Math.random() * 10) ไว้สุ่มเลขระหว่าง 1 ถึง 10 ได้) ในกรณีที่ (a / b) เป็นจำนวนบวกที่ไม่เกิน 2147483647 (กรณีที่เกินนั้นหรือเป็นจำนวนลบ ให้เป็นการบ้านไปหาคำตอบเอง)