JavaScript/Math/clz32

カテゴリ:Book:JavaScript#Math/clz32%20

Math.clz32(x) は、引数 x を32ビット整数として扱い、そのビット表現における先頭のゼロの数を返します[1]

  • 引数 xNaN の場合、32 を返します。
  • 引数 x+0 または -0 の場合、32 を返します。
  • 引数 xInfinity または -Infinity の場合、0 を返します。
  • 引数 x1 以上の場合、32 - floor(log2(x)) - 1 を返します。

先頭のゼロの数を計算するプログラム

以下のプログラムは、ユーザーが入力した値の32ビット整数表現における先頭のゼロの数を計算します。

const f = p => {
  for (;;) {
    a = prompt(`${p}は何ですか?`);
    if (!isNaN(a))
      return a;
    alert(`${p}に、入力ミスがあります。 "${a}"`);
  }
}

for (;;) {
  const x = f("値");
  const clz32 = Math.clz32(x);
  if (!isNaN(clz32)) {
    alert(`${x} の32ビット整数表現における先頭のゼロの数は ${clz32} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.clz32 を使用して値の32ビット整数表現における先頭のゼロの数を計算しています。ユーザーが入力した値が NaNInfinity の場合、適切に処理されます。

先頭のゼロの数を利用したビット操作

以下のプログラムは、Math.clz32 を使用して、与えられた数値の最上位ビットの位置を計算します。

const f = p => {
  for (;;) {
    a = prompt(`${p}は何ですか?`);
    if (!isNaN(a))
      return a;
    alert(`${p}に、入力ミスがあります。 "${a}"`);
  }
}

for (;;) {
  const x = f("値");
  const clz32 = Math.clz32(x);
  const msb = 31 - clz32;
  if (!isNaN(msb)) {
    alert(`${x} の最上位ビットの位置は ${msb} です。`);
    break;
  }
  alert("入力が大きすぎます。");
}

このプログラムでは、Math.clz32 を使用して、与えられた数値の最上位ビットの位置を計算しています。msb は、最上位ビットの位置を表します。

注意点

  • 32ビット整数: Math.clz32 は、引数 x を32ビット整数として扱います。このため、x が32ビット整数の範囲外の場合、結果が予期しないものになることがあります。
  • 精度: 浮動小数点演算の特性上、Math.clz32 の結果には微小な誤差が含まれることがあります。

脚註

  1. これは、32ビット整数の最上位ビットから数えて、最初の 1 が現れるまでの 0 の数を返します。

外部リンク

カテゴリ:Book:JavaScript#Math/clz32%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension