JavaScript/Math/clz32
Math.clz32(x)
は、引数 x
を32ビット整数として扱い、そのビット表現における先頭のゼロの数を返します[1]。
- 引数
x
がNaN
の場合、32
を返します。 - 引数
x
が+0
または-0
の場合、32
を返します。 - 引数
x
がInfinity
または-Infinity
の場合、0
を返します。 - 引数
x
が1
以上の場合、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ビット整数表現における先頭のゼロの数を計算しています。ユーザーが入力した値が NaN
や Infinity
の場合、適切に処理されます。
先頭のゼロの数を利用したビット操作
以下のプログラムは、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
の結果には微小な誤差が含まれることがあります。
脚註
- ↑ これは、32ビット整数の最上位ビットから数えて、最初の
1
が現れるまでの0
の数を返します。