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

การปัดเศษตัวเลขให้เป็นกำลังของ 2 ที่ใกล้ที่สุดใน JavaScript

ภาพรวม

บทความนี้สาธิตวิธีหาตัวเลขที่เป็นกำลังของ 2 (2ⁿ) ที่ใกล้ที่สุดกับตัวเลขที่กำหนด เช่น 145 -> 128 (2⁷)

การนำไปใช้

const nearestPowerOfTwo = (num) => {
  // จัดการตัวเลขติดลบ
  if (num < 0) num *= -1;
  
  let base = 1;
  while (base < num) {
    // ตรวจสอบว่าฐานปัจจุบันใกล้กว่าฐานถัดไป
    if (num - base < Math.floor(base / 2)) {
      return base;
    }
    base *= 2;
  }
  return base;
};

console.log(nearestPowerOfTwo(145)); // 128

ผลลัพธ์

128

วิธีการทางคณิตศาสตร์ (เร็วกว่า)

const nearestPowerOfTwoMath = (num) => {
  if (num <= 0) return 1;
  const log2 = Math.log2(num);
  const lower = Math.pow(2, Math.floor(log2));
  const upper = Math.pow(2, Math.ceil(log2));
  
  // เปรียบเทียบระยะทาง
  return (num - lower) < (upper - num) ? lower : upper;
};

วิธีการใช้ Bitwise (เร็วที่สุด สำหรับ Integer)

const nearestPowerOfTwoBitwise = (num) => {
  if (num <= 0) return 1;
  num = Math.floor(num);
  
  // หากเป็นกำลังของ 2 อยู่แล้ว
  if ((num & (num - 1)) === 0) return num;
  
  // หา MSB (Most Significant Bit)
  let msb = 1;
  while (msb <= num) msb <<= 1;
  
  const lower = msb >> 1;
  return (num - lower) < (msb - num) ? lower : msb;
};

ตารางกำลังของ 2 (อ้างอิง)

n2ⁿn2ⁿ
011665,536
1217131,072
2418262,144
3819524,288
416201,048,576
532212,097,152
664224,194,304
7128238,388,608
82562416,777,216
95122533,554,432
101,0242667,108,864
112,04827134,217,728
124,09628268,435,456
138,19229536,870,912
1416,384301,073,741,824
1532,768312,147,483,648

การประยุกต์ใช้

  • Memory Allocation (หน่วยความจำจัดสรรเป็นบล็อกกำลังของ 2)
  • Texture Sizes ใน WebGL/OpenGL
  • Hash Table Sizing
  • FFT (Fast Fourier Transform) Buffer Sizes
  • Binary Tree Array Representation