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

ฟังก์ชัน Atomics.xor() ใน JavaScript

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-inversea ^ b ^ b = aเข้ารหัส/ถอดรหัสด้วย key เดียวกัน
Commutativea ^ b = b ^ aลำดับไม่สำคัญ
Associative(a ^ b) ^ c = a ^ (b ^ c)จัดกลุ่มได้อย่างอิสระ
Identitya ^ 0 = a0 ไม่เปลี่ยนค่า
Togglea ^ 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