bsf
Bit Scan Forward
Scans for LSB set to 1.
Pseudocode Operation
for i ← 0 to (width - 1):
if (src >> i) & 1 == 1:
dest ← i;
ZF ← 0;
return;
ZF ← 1;
dest ← undefined;
Example
Encoding
Operands
-
dest
General-purpose register -
src
Register or memory operand
Related
Across architectures
Count Trailing Zeros : how x86, ARM, RISC-V, and PowerISA each do this.
More in Base
Reference
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| 0F BC /r | BSF r16, r/m16 | RM | Valid Valid | Bit scan forward on r/m16. | |
| 0F BC /r | BSF r32, r/m32 | RM | Valid Valid | Bit scan forward on r/m32. | |
| REX.W + 0F BC /r | BSF r64, r/m64 | RM | Valid N.E. | Bit scan forward on r/m64. |
Description
Searches the source operand (second operand) for the least significant set bit (1 bit). If a least significant 1 bit is found, its bit index is stored in the destination operand (first operand). The source operand can be a register or a memory location; the destination operand is a register. The bit index is an unsigned offset from bit 0 of the source operand. If the content of the source operand is zero, the destination operand is unmodified.1 In 64-bit mode, the instruction’s default operation size is 32 bits. Using a REX prefix in the form of REX.R permits access to additional registers (R8-R15). Using a REX prefix in the form of REX.W promotes operation to 64 bits. See the summary chart at the beginning of this section for encoding data and limits.
Operation
IF SRC <> 0 THEN temp := 0; WHILE Bit(SRC, temp) = 0 DO temp := temp + 1; OD; DEST := temp; FI;