Atomics.xor() คืออะไร
ฟังก์ชัน Atomics.xor() ดำเนินการ Bitwise XOR (Exclusive OR) แบบอะตอมิก บนค่าที่อยู่ในตำแหน่งที่กำหนดของ typed array ที่แบ่งปัน ฟังก์ชันนี้รับ typed array, ตำแหน่ง (index), และค่า (value) แล้วทำการ XOR ระหว่างค่าปัจจุบันกับค่าที่กำหนด เก็บผลลัพธ์ไว้ และคืนค่า เดิม (old value) ก่อนการดำเนินการ
XOR (^) มีคุณสมบัติพิเศษ: a ^ b ^ b = a ทำให้เหมาะสำหรับการเข้ารหัสง่ายๆ, toggling bits, และ checksums
ไวยากรณ์ (Syntax)
Atomics.xor(typedArray, index, value)
typedArray- Typed array ที่แบ่งปัน (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array)index- ตำแหน่งในอาร์เรย์value- ค่าที่จะทำ Bitwise XOR
คืนค่า: ค่าที่อยู่ในตำแหน่ง index ก่อน การดำเนินการ XOR
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การทำ XOR พื้นฐาน
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 30; // 00011110
const oldValue = Atomics.xor(data, 0, 3); // 3 = 00000011
console.log('ค่าเดิม:', oldValue); // 30
console.log('ค่าใหม่:', Atomics.load(data, 0)); // 29 (00011101)
คำอธิบาย: 30 (00011110) XOR 3 (00000011) = 29 (00011101)
ตัวอย่างที่ 2: Toggle Bits (สลับสถานะ bit)
const buffer = new SharedArrayBuffer(4);
const flags = new Uint8Array(buffer);
flags[0] = 0; // 00000000
const FLAG_READ = 1; // 00000001
const FLAG_WRITE = 2; // 00000010
const FLAG_EXEC = 4; // 00000100
// Toggle READ flag
Atomics.xor(flags, 0, FLAG_READ);
console.log(Atomics.load(flags, 0)); // 1 (READ enabled)
// Toggle READ flag อีกครั้ง -> ปิด
Atomics.xor(flags, 0, FLAG_READ);
console.log(Atomics.load(flags, 0)); // 0 (READ disabled)
// Toggle WRITE
Atomics.xor(flags, 0, FLAG_WRITE);
console.log(Atomics.load(flags, 0)); // 2 (WRITE enabled)
ตัวอย่างที่ 3: Simple XOR Encryption/Decryption
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
const key = 0xAA; // 10101010
// เขียนข้อมูลต้นฉบับ
const original = [72, 101, 108, 108, 111]; // "Hello"
original.forEach((v, i) => data[i] = v);
console.log('Original:', String.fromCharCode(...data.slice(0, 5))); // Hello
// เข้ารหัส: XOR ด้วย key
for (let i = 0; i < 5; i++) {
Atomics.xor(data, i, key);
}
console.log('Encrypted:', Array.from(data.slice(0, 5))); // ค่าที่เปลี่ยนแล้ว
// ถอดรหัส: XOR ด้วย key เดิมอีกครั้ง
for (let i = 0; i < 5; i++) {
Atomics.xor(data, i, key);
}
console.log('Decrypted:', String.fromCharCode(...data.slice(0, 5))); // Hello
ตัวอย่างที่ 4: Checksum / Parity
const buffer = new SharedArrayBuffer(4);
const checksum = new Uint8Array(buffer);
checksum[0] = 0;
// เพิ่มข้อมูลเข้า checksum ด้วย XOR
function addToChecksum(byte) {
Atomics.xor(checksum, 0, byte);
}
addToChecksum(0x12);
addToChecksum(0x34);
addToChecksum(0x56);
console.log('Checksum:', checksum[0].toString(16)); // 12 ^ 34 ^ 56 = 70
// ตรวจสอบความสมบูรณ์
const verify = 0x12 ^ 0x34 ^ 0x56 ^ checksum[0];
console.log('Verify:', verify === 0); // true
คุณสมบัติของ XOR ที่มีประโยชน์
| คุณสมบัติ | สูตร | ประโยชน์ |
|---|---|---|
| Self-inverse | a ^ b ^ b = a | เข้ารหัส/ถอดรหัสด้วย key เดียวกัน |
| Commutative | a ^ b = b ^ a | ลำดับไม่สำคัญ |
| Associative | (a ^ b) ^ c = a ^ (b ^ c) | จัดกลุ่มได้อย่างอิสระ |
| Identity | a ^ 0 = a | 0 ไม่เปลี่ยนค่า |
| Toggle | a ^ 1 = ~a (bitwise not สำหรับ bit นั้น) | สลับ bit ได้ |
กรณีการใช้งานทั่วไป
- Flag toggling: เปิด/ปิด feature flags แบบ thread-safe
- Simple encryption: XOR cipher สำหรับข้อมูลไม่ละเอียดอ่อน
- Checksums: Parity bits, longitudinal redundancy check
- Random number generation: XORShift algorithms
- Graphics: XOR drawing mode (invert colors)
กรณีพิเศษและข้อผิดพลาด
- โยน
RangeErrorหากindexอยู่นอกขอบเขต - โยน
TypeErrorหากtypedArrayไม่ใช่ integer typed array - ไม่รองรับ
Float32Array,Float64Array,BigInt64Array,BigUint64Array - ค่า
valueจะถูกแปลงเป็น unsigned integer ตามขนาดของ typed array