Update function-bit32-clz-ctz.md

Rename to countlz/countrz
This commit is contained in:
Arseny Kapoulkine 2021-10-27 08:30:51 -07:00 committed by GitHub
parent 68ec52a17c
commit 668e82b70b
Signed by: DevComp
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,8 +1,8 @@
# bit32.clz/ctz # bit32.countlz/countrz
## Summary ## Summary
Add bit32.clz (count leading zeroes) and bit32.ctz (count trailing zeroes) to accelerate bit scanning Add bit32.countlz (count left zeroes) and bit32.countrz (count right zeroes) to accelerate bit scanning
## Motivation ## Motivation
@ -12,28 +12,27 @@ All CPUs have instructions to determine the position of first/last set bit in an
- Scanning set bits in an integer, which allows efficient traversal of compact representation of bitmaps - Scanning set bits in an integer, which allows efficient traversal of compact representation of bitmaps
- Allocating bits out of a bitmap quickly - Allocating bits out of a bitmap quickly
Today it's possible to approximate `clz` using `floor` and `log` but this approximation is relatively slow; approximating `ctz` is difficult without iterating through each bit. Today it's possible to approximate `countlz` using `floor` and `log` but this approximation is relatively slow; approximating `ccountrz` is difficult without iterating through each bit.
## Design ## Design
`bit32` library will gain two new functions, `clz` and `ctz`: `bit32` library will gain two new functions, `countlz` and `countrz`:
``` ```
function bit32.clz(n: number): number function bit32.countlz(n: number): number
function bit32.ctz(n: number): number function bit32.countrz(n: number): number
``` ```
`clz` takes an integer number (converting the input number to a 32-bit unsigned integer as all other `bit32` functions do), and returns the number of leading zero bits - that is, `countlz` takes an integer number (converting the input number to a 32-bit unsigned integer as all other `bit32` functions do), and returns the number of consecutive left-most zero bits - that is, the number of most significant zero bits in a 32-bit number until the first 1. The result is in `[0, 32]` range.
the number of most significant zero bits in a 32-bit number until the first 1. The result is in `[0, 32]` range.
For example, when the input number is `0`, it's `32`. When the input number is `2^k`, the result is `31-k`. For example, when the input number is `0`, it's `32`. When the input number is `2^k`, the result is `31-k`.
`ctz` takes an integer number (converting the input number to a 32-bit unsigned integer as all other `bit32` functions do), and returns the number of trailing zero bits - that is, `countrz` takes an integer number (converting the input number to a 32-bit unsigned integer as all other `bit32` functions do), and returns the number of consecutive right-most zero bits - that is,
the number of least significant zero bits in a 32-bit number until the first 1. The result is in `[0, 32]` range. the number of least significant zero bits in a 32-bit number until the first 1. The result is in `[0, 32]` range.
For example, when the input number is `0`, it's `32`. When the input number is `2^k`, the result is `k`. For example, when the input number is `0`, it's `32`. When the input number is `2^k`, the result is `k`.
> Non-normative: a proof of concept implementation shows that a polyfill for `clz` takes ~34 ns per loop iteration when computing `clz` for an increasing number sequence, whereas > Non-normative: a proof of concept implementation shows that a polyfill for `countlz` takes ~34 ns per loop iteration when computing `countlz` for an increasing number sequence, whereas
> a builtin implementation takes ~4 ns. > a builtin implementation takes ~4 ns.
## Drawbacks ## Drawbacks
@ -46,4 +45,6 @@ These functions can be alternatively specified as "find the position of the most
can be more immediately useful since the bit position is usually more important than the number of bits. However, the bit position is undefined when the input number is zero, can be more immediately useful since the bit position is usually more important than the number of bits. However, the bit position is undefined when the input number is zero,
returning a sentinel such as -1 seems non-idiomatic, and returning `nil` seems awkward for calling code. Counting functions don't have this problem. returning a sentinel such as -1 seems non-idiomatic, and returning `nil` seems awkward for calling code. Counting functions don't have this problem.
Of the two functions, `clz` is vastly more useful than `ctz`; we could implement just `clz`, but having both is nice for symmetry. An early version of this proposal suggested `clz`/`ctz` (leading/trailing) as names; however, using a full verb is more consistent with other operations like shift/rotate, and left/right may be easier to understand intuitively compared to leading/trailing. left/right are used by C++20.
Of the two functions, `countlz` is vastly more useful than `countrz`; we could implement just `countlz`, but having both is nice for symmetry.