Author: | Wojciech Muła |
---|---|
Added on: | 2010-04-11 |
Method from Bit Twiddling Hacks: (x != 0) && (x & (x-1) == 0). GCC compiles this to following code:
; input/ouput: eax ; destroys: ebx test %eax, %eax ; x == 0? jz 1f leal -1(%eax), %ebx ; ebx := x-1 test %eax, %ebx ; ZF := (eax & ebx == 0) setz %al movzx %al, %eax ; eax := ZF 1:
We can use also BSF and BSR instructions, which determine position of first and last bit=1, respectively. If a number is power of 2, then just one bit is set, and thus these positions are equal. BSx sets also ZF flag if input value is zero.
; input/output: eax ; destroys: ebx, edx bsf %eax, %ebx ; ebx := LSB's position if eax != 0, ZF = 1 if eax = 0 jz 1f bsr %eax, %edx ; edx := MSB's position cmp %ebx, %edx ; ZF := (ebx = edx) setz %al movzx %al, %eax ; eax := ZF 1: