This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

Math.clz32()

Baseline Widely available

This feature is well established and works across many devices and browser versions. Itโ€™s been available across browsers since โจ2015๋…„ 7์›”โฉ.

Math.clz32() ์ •์  ๋ฉ”์„œ๋“œ๋Š” ์ˆซ์ž์˜ 32๋น„ํŠธ ์ด์ง„ ํ‘œํ˜„์—์„œ ์„ ํ–‰ 0 ๋น„ํŠธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด ๋ณด๊ธฐ

// 00000000000000000000000000000001
console.log(Math.clz32(1));
// Expected output: 31

// 00000000000000000000000000000100
console.log(Math.clz32(4));
// Expected output: 29

// 00000000000000000000001111101000
console.log(Math.clz32(1000));
// Expected output: 22

๊ตฌ๋ฌธ

js
Math.clz32(x)

๋งค๊ฐœ๋ณ€์ˆ˜

x

์ˆซ์ž์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐ’

32๋น„ํŠธ ์ด์ง„ ํ‘œํ˜„์—์„œ x ์˜ ์„ ํ–‰ 0 ๋น„ํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…

clz32 ๋Š” CountLeadingZeros32 ์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

๋งŒ์ผ x ๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ์ด๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ˆซ์ž๋กœ ๋ณ€ํ™˜์ด ๋˜๊ณ  ๊ทธ ๋‹ค์Œ 32๋น„ํŠธ์˜ ๊ธฐํ˜ธ๊ฐ€ ์—†๋Š” ์ •์ˆ˜๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜๋œ 32๋น„ํŠธ์˜ ๊ธฐํ˜ธ ์—†๋Š” ์ •์ˆ˜๊ฐ€ 0 ์ด๋ผ๋ฉด 32 ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋“  ๋น„ํŠธ๋Š” 0 ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ (์ˆซ์ž๊ฐ€ 231 ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ) ๊ฐ€์žฅ ํฐ ๋น„ํŠธ๊ฐ€ 1 ์ด๋ผ๋ฉด 0 ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” Emscripten ์ฒ˜๋Ÿผ JS๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ฒด๊ณ„์— ํŠนํžˆ ๋” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

Math.clz32() ์‚ฌ์šฉํ•˜๊ธฐ

js
Math.clz32(1); // 31
Math.clz32(1000); // 22
Math.clz32(); // 32

const stuff = [
  NaN,
  Infinity,
  -Infinity,
  0,
  -0,
  false,
  null,
  undefined,
  "foo",
  {},
  [],
];
stuff.every((n) => Math.clz32(n) === 32); // true

Math.clz32(true); // 31
Math.clz32(3.5); // 30

์„ ํ–‰ ๋น„ํŠธ ์—ฐ์‚ฐ๊ณผ ๊ทธ ์ด์ƒ

ํ˜„์žฌ๋Š” ์„ ํ–‰ ๋น„ํŠธ ์—ฐ์‚ฐ("clo" ๊ฐ€ ์•„๋‹ˆ๋ผ "clon" ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋Š” "clo" ์™€ "clz" ๊ฐ€ ์˜์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)์„ ์œ„ํ•œ Math.clon ํ•จ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ clon ํ•จ์ˆ˜๋Š” ์‰ฝ๊ฒŒ ๋น„ํŠธ๋ฅผ ์ˆซ์ž๋กœ ์—ฐ์‚ฐํ•˜์–ด Math.clz32 ์˜ ๊ฒฐ๊ด๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” 1์˜ ๋ฐ˜๋Œ€๊ฐ€ 0์ด๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„ํŠธ๋ฅผ ๋ฐ˜์ „์‹œํ‚ค๋ฉด 0์˜ ์ธก์ •๋œ ์ˆ˜๋Ÿ‰( Math.clz32 ์—์„œ)์ด ๋ฐ˜์ „๋˜์–ด Math.clz32 ๊ฐ€ 0 ๋Œ€์‹  1์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ 32๋น„ํŠธ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

js
const a = 32776; // 00000000000000001000000000001000 (16๊ฐœ์˜ ์„ ํ–‰ 0์ด ์žˆ์Œ)
Math.clz32(a); // 16

const b = ~32776; // 11111111111111110111111111110111 (32776 ๋ฐ˜์ „, 0๊ฐœ์˜ ์„ ํ–‰ 0์ด ์žˆ์Œ)
Math.clz32(b); // 0 (์ด๋Š” a์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์„ ํ–‰ ๊ฐ’์ด ์žˆ๋Š”์ง€์™€ ๋™์ผํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.)

์ด ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋ฉด clon ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

js
const clz = Math.clz32;

function clon(integer) {
  return clz(~integer);
}

๋” ๋‚˜์•„๊ฐ€, ์ด ๊ธฐ์ˆ ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ ํ”„๊ฐ€ ์—†๋Š” "ํ›„ํ–‰ 0 ์„ธ๊ธฐ" ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ์— ํ™•์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ctrz ํ•จ์ˆ˜๋Š” ์ •์ˆ˜์™€ ๊ทธ 2์˜ ๋ณด์ˆ˜์˜ ๋น„ํŠธ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 2์˜ ๋ณด์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ, ๋ชจ๋“  ํ›„ํ–‰ ์ œ๋กœ๋Š” 1๋กœ ๋ณ€ํ™˜๋˜๊ณ , 1์„ ๋”ํ•  ๋•Œ (์›๋ž˜๋Š” 1์ด์—ˆ๋˜) ์ฒซ๋ฒˆ์งธ 0 ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์˜ฌ๋ฆผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ๋ณด๋‹ค ๋†’์€ ๋ชจ๋“  ๋น„ํŠธ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฉฐ ์›๋ž˜ ์ •์ˆ˜ ๋น„ํŠธ์˜ ์—ญ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›๋ž˜ ์ •์ˆ˜์™€ ๋น„ํŠธ AND ์—ฐ์‚ฐ์„ ํ•  ๋•Œ, ๋” ๋†’์€ ๋ชจ๋“  ๋น„ํŠธ๋Š” 0 ์ด ๋˜๋ฉฐ, ์ด๋Š” clz ๋กœ ์นด์šดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํ–‰ ์ œ๋กœ์˜ ์ˆ˜์™€ ์ฒ˜์Œ 1 ๋น„ํŠธ, ๊ทธ๋ฆฌ๊ณ  clz ๋กœ ์„ธ์–ด์ง„ ์„ ํ–‰ ๋น„ํŠธ์˜ ํ•ฉ์€ 32๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

js
function ctrz(integer) {
  integer >>>= 0; // Uint32๋กœ ๋ณ€ํ™˜
  if (integer === 0) {
    // ์ด ๊ตฌ๋ฌธ์„ ์Šคํ‚ตํ•˜๋ฉด -1์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    return 32;
  }
  integer &= -integer; // ๋‹ค์Œ ์—ฐ์‚ฐ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. `int = int & (~int + 1)`
  return 31 - clz(integer);
}

"ํ›„ํ–‰ 0 ์„ธ๊ธฐ" ํ•จ์ˆ˜๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

js
function ctron(integer) {
  return ctrz(~integer);
}

์ด ํ—ฌํผ ํ•จ์ˆ˜๋“ค์€ ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด asm.js ๋ชจ๋“ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const countTrailsMethods = (function (stdlib, foreign, heap) {
  "use asm";
  const clz = stdlib.Math.clz32;

  // ํ›„ํ–‰ 0 ์„ธ๊ธฐ
  function ctrz(integer) {
    integer = integer | 0; // ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
    if ((integer | 0) == 0) {
      // ์ด ๊ตฌ๋ฌธ์„ ์Šคํ‚ตํ•˜๋ฉด -1์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      return 32;
    }
    // Note: asm.js๋Š” &=์™€ ๊ฐ™์€ ๋ณตํ•ฉ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    integer = integer & -integer; // ๋‹ค์Œ ์—ฐ์‚ฐ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. `int = int & (~int + 1)`
    return (31 - clz(integer)) | 0;
  }

  // ํ›„ํ–‰ ๊ฐฏ์ˆ˜ ์„ธ๊ธฐ
  function ctron(integer) {
    integer = integer | 0; // ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
    return ctrz(~integer) | 0;
  }

  // asm.js๋Š” ์ˆœ์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  return { ctrz: ctrz, ctron: ctron };
})(window, null, null);

const { ctrz, ctron } = countTrailsMethods;

๋ช…์„ธ์„œ

Specification
ECMAScriptยฎ 2026 Language Specification
# sec-math.clz32

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

๊ฐ™์ด ๋ณด๊ธฐ