Atomics.and() คืออะไร
ฟังก์ชัน Atomics.and() ดำเนินการ Bitwise AND แบบอะตอมิก บนค่าที่อยู่ในตำแหน่งที่กำหนดของ typed array ที่แบ่งปัน ฟังก์ชันนี้รับ typed array, ตำแหน่ง (index), และค่า (value) แล้วทำการ AND ระหว่างค่าปัจจุบันกับค่าที่กำหนด เก็บผลลัพธ์ไว้ และคืนค่า เดิม (old value) ก่อนการดำเนินการ
ไวยากรณ์ (Syntax)
Atomics.and(typedArray, index, value)
typedArray- Typed array ที่แบ่งปัน (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array)index- ตำแหน่งในอาร์เรย์value- ค่าที่จะทำ Bitwise AND
คืนค่า: ค่าที่อยู่ในตำแหน่ง index ก่อน การดำเนินการ AND
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การทำ AND พื้นฐาน
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 3; // 00000011
const oldValue = Atomics.and(data, 0, 3); // 3 = 00000011
console.log('ค่าเดิม:', oldValue); // 3
console.log('ค่าใหม่:', Atomics.load(data, 0)); // 3 (00000011)
ตัวอย่างที่ 2: การล้าง bit เฉพาะ (Clear specific bits)
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 7; // 00000111
// ล้าง bit 0 และ bit 1 (เก็บแค่ bit 2 ขึ้นไป)
// ใช้ mask = ~3 = ...11111100 (แต่ใน 8-bit คือ 252)
console.log('ก่อน AND:', Atomics.and(data, 0, 252)); // คืนค่า 7
console.log('หลัง AND:', Atomics.load(data, 0)); // 4 (00000100)
ตัวอย่างที่ 3: ตรวจสอบและล้างแฟล็กพร้อมกัน
const FLAGS = {
READ: 1, // 0001
WRITE: 2, // 0010
EXECUTE: 4, // 0100
ADMIN: 8 // 1000
};
const buffer = new SharedArrayBuffer(4);
const permissions = new Uint8Array(buffer);
permissions[0] = FLAGS.READ | FLAGS.WRITE | FLAGS.EXECUTE; // 7 (0111)
// ต้องการลบสิทธิ์ WRITE ออก (clear bit 1)
// ใช้ mask ที่มี bit 1 เป็น 0, ที่เหลือเป็น 1: ~FLAGS.WRITE = ~2 = ...11111101
const mask = ~FLAGS.WRITE & 0xFF; // 253 (11111101) สำหรับ 8-bit
const oldPerm = Atomics.and(permissions, 0, mask);
console.log('สิทธิ์เดิม:', oldPerm); // 7
console.log('สิทธิ์ใหม่:', Atomics.load(permissions, 0)); // 5 (READ | EXECUTE)
การประยุกต์ใช้ Bitwise AND แบบอะตอมิก
1. การล้างแฟล็ก (Clear Flags)
ใช้ mask ที่มี bit ที่ต้องการล้างเป็น 0 และ bit อื่นเป็น 1
2. การตรวจสอบสิทธิ์ (Permission Checking)
function hasPermission(permissions, index, requiredFlag) {
const current = Atomics.load(permissions, index);
return (current & requiredFlag) !== 0;
}
// การใช้งาน
const buffer = new SharedArrayBuffer(4);
const perms = new Uint8Array(buffer);
Atomics.or(perms, 0, 5); // READ | EXECUTE
console.log(hasPermission(perms, 0, 1)); // true (READ)
console.log(hasPermission(perms, 0, 2)); // false (WRITE)
3. Bitmask Filtering
ใช้กรองค่าที่ต้องการจากกลุ่ม bit
กรณีพิเศษและข้อผิดพลาด
- โยน
RangeErrorหากindexอยู่นอกขอบเขต - โยน
TypeErrorหากtypedArrayไม่ใช่ integer typed array - ไม่รองรับ typed array แบบ floating-point หรือ BigInt
- ค่า
valueจะถูกแปลงเป็น unsigned integer ตามขนาดของ typed array