先頭ゼロビット計算
固定幅のワードで、最上位の1より上にあるゼロビットを数えます。8ビットの16は00010000なので、結果は3です。ビット長と桁をそろえた2進表記も分かり、ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 値
- 16
- 幅
- 8
- 先頭のゼロの数
- 3
- ビット長
- 5
- 2進数
- 00010000
- 最上位ビット
- 4
先頭ゼロの計数 — CLZ、LZCNT、または BSR 由来の走査 — は、固定幅ワード内の符号なし整数について、最上位の 1 ビットより上に並ぶゼロビットの個数です。コンパイラはこの計数を整数 log2、シフト前の仮数正規化、状態レジスタで最初に立ったフラグの探索に使います。本先頭ゼロ計算機は、非負整数を十進数字、0x 接頭の十六進、0b の二進、0o の八進のいずれかで受け取り、語長は八・十六・三十二・六十四ビットです。CLZ の個数、絶対値のビット長、先頭ゼロが見える幅詰め二進列、値がゼロでないときの最上位セットビットのゼロ始まり番号を返します。ゼロは第一級の場合で、すべてのビットが先頭ゼロなので計数は選んだ幅と一致します。
固定幅ワードにおける先頭ゼロ計数の意味
ハードウェアの先頭ゼロ命令は、抽象的な数学の整数ではなく、幅が分かっているレジスタを見ます。八ビットワードでは値十六はビット列 00010000 で、最も高い 1 の上にゼロが三つあるので CLZ は三です。
三十二ビットワードでは同じ大きさは 00000000000000000000000000010000 となり、レジスタを広げると高い側に二十四個のゼロが増えるため CLZ は二十七になります。代数的には正の整数のビット長は値の二を底とする対数の床に一を足したもので、先頭ゼロの個数は語長からそのビット長を引いた値です。
値がゼロのときは最上位セットビットが存在せず、どの位置も先頭ゼロなので計数は幅と一致します。
これは x86 の LZCNT、ARM の CLZ、RISC-V の clz、コンパイラ組み込みの __builtin_clz と leadingZeroBitCount の約束で、古い BSR 符号化がときどき結果を未定義にしたのとは違い、ゼロオペランドには語長そのものを返します。本能力はその恒等式をそのまま実装します。
formula は対数の恒等式を再掲し、生成文書や試験コメントが計算機と同じ文を引用できるようにします。
先頭ゼロ計算機が役立つ場面
コンパイラと仮想機械の作者は、整数 log2、最も高いフラグの探索、浮動小数風シフトの前の仮数正規化のために CLZ またはソフトウェア代替を出します。ゼロと対応するすべての幅でハードウェアと一致する神託が要り、回帰一式が対数恒等式のオフバイワンを黙って通さないようにします。
ファームウェアとドライバの作者は状態・許可レジスタを読み、触る言語ごとに移植可能な clz 補助を書かずに、保留中で最も高いビットの番号を欲しがります。暗号と多倍長整数のライブラリは左シフトの前やノンスの有意ビットを数える前に肢を正規化し、固定幅の計算機は八から六十四ビット、ゼロだらけの肢まで、それらの補助を確かめる最短の手段です。
活用例
コンパイラと仮想機械の CLZ 神託
整数 log2、LZCNT への下げ、ゼロオペランドの振る舞いを、8/16/32/64 ビットのハードウェア約束に対してコンパイラとインタプリタの回帰一式で確かめます。
ビット長と log2 の授業
選んだ語長について、手書きの詰め二進と CLZ 計数を、CPU シミュレータを動かさずに学生が照合できるようにします。
よくある質問
先頭ゼロ計数はゼロに対して何を返しますか?
LZCNT、ARM の CLZ、コンパイラ組み込みと同じです。
なぜ 8・16・32・64 ビットを選ぶ必要がありますか?
CLZ は固定幅レジスタ上で定義されます。同じ大きさでも 8 ビットのバイトと 32 ビットのワードでは先頭ゼロの個数が違います。閉じた enum はよくある CPU と言語の幅に合わせています。
16進数や2進数で入力できますか?
できます。10進数のほか、0xを付けた16進数、0bを付けた2進数、0oを付けた8進数で入力できます。符号なしとして読み取り、選んだ幅に収まる必要があるため、8ビットでは9ビット目が必要になる数を受け付けません。
先頭ゼロの数と2を底とする対数はどう関係しますか?
正の数のビット長は、2を底とする対数の整数部分に1を足した値で、先頭ゼロの数はワード幅からそのビット長を引いた値です。8ビットの16ならビット長は5なので、結果は3になります。
最上位ビットの位置はどう数えますか?
プログラミングで一般的なとおり、最下位ビットを0番として数えます。そのため16の最上位ビットは4番と表示されます。値が0のときは、示すべきビットがありません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/count-leading-zeros \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"value":"16","width":8}'const res = await fetch("https://api.kit.forhosting.com/dev/count-leading-zeros", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"value": "16",
"width": 8
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/count-leading-zeros",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"value": "16",
"width": 8
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/count-leading-zeros", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"value":"16","width":8}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"value":"16","width":8}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/count-leading-zeros", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"value": "16",
"width": 8
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.count_leading_zeros",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
固定幅ワードにおける先頭ゼロ計数の意味
任意項目 most_significant_bit のビット番号は、ビットゼロが最下位である通常の約束に従い、十六なら most_significant_bit は四です。詰められた二進フィールドは 0b 接頭なしでちょうど width 文字の 0 と 1 であり、二度目の変換なしに先頭ゼロが見えます。
入力契約・幅・エラー時の振る舞い
value は十進数字列、0x 十六進リテラル、0b 二進リテラル、0o 八進リテラルで書いた非負整数です。値は符号なしとして解釈され、そのビット数に収まらねばなりません。十六は八ビットで合法、二百五十六は九ビット目が要るため不可です。必須項目が二つの JSON 本体を POST してください。安全な非負の JSON 数値も受け付け、別名 n・integer・x は同じ項目を指します。width は符号なし語長で、八・十六・三十二・六十四という閉じた集合のいずれか — よくある CLZ 命令の幅 — であり、bits または bit_width でも受け付けます。欠落項目、空文字、真偽値、符号、小数、未知の接頭、enum 外の width は規則名付きの invalid_input で失敗し、課金されません。成功時は value を先頭ゼロなしの正規十進文字列(ゼロそのものは除く)として、width を数値としてエコーし、主計数として leading_zeros、絶対値の幅として bit_length(値がゼロならゼロ)、幅詰めビット列として binary を返します。most_significant_bit は値がゼロでないときだけあり、null にはせず省略して任意出力を誠実に保ちます。例: value が十六で width が八なら leading_zeros は三、bit_length は五、binary は 00010000、most_significant_bit は四です。例: value がゼロで width が三十二なら leading_zeros は三十二、bit_length はゼロ、ゼロ文字が三十二個並び、most_significant_bit はありません。
先頭ゼロ計算機が役立つ場面
ビット演算と IEEE 風正規化を教える側は、値と幅を与え、手書きの詰め二進と CLZ 計数を、ISA シミュレータ一式ではなく決定的なサービスと照合できます。parse の A 段階のため、成功する呼び出しはモデルトークンも外向きネットもなく公開の基本料金 $0.002 で、無効入力は残高を消費しません。要求を小さく保ち、leading_zeros と詰め二進列を試験に固定すれば、独自のビット走査ライブラリを立てずに SDK・CMS 断片・エッジワーカー向けの再現可能な CLZ 結果が得られます。
連携の活用例
レジスタとフラグの正規化
状態または許可ワードの最も高い 1 より上にいくつ高いゼロがあるかを求め、フィールドを正規位置へシフトする前に使います。
技術的な質問
整数の先頭ゼロビットはどう数えますか。
value(非負の十進、0x、0b、または 0o)と width(8、16、32、または 64)を送ってください。API は value が 0 のとき leading_zeros = width、それ以外は width − floor(log2(value)) − 1 を返します。
十六進や JSON 数値を送れますか。
送れます。value は十進数字、0x 十六進、0b 二進、0o 八進、または安全な非負 JSON 整数を受け付けます。値は選んだ符号なし幅に収まる必要があります。
先頭ゼロ計算機の料金はいくらですか。
ブラウザの道具は無料です。API 要求は成功した呼び出しごとに前払い KIT 残高を $0.002 使い、無効入力は課金されません。