有时候用到位运算。需要快速找到一个整数的二进制第一个1或0在哪个位(下标)?例如:十进制数100的二进制是1100100,那么它的第一个1在下标为2的位置(bsf, bit scan forward)或6的位置(bsr, bit scan in reverse order),由于只用于存储一个状态,至于用bsf还是bsr则无所谓。解决这个问题的第一个想法就是用内联汇编的做法,使用特别的CPU指令去找,但汇编的可移植性比较差,不同的CPU型号使用的指令可能不一样,执行速度也不一样。假设找一个64位无符号整数二进制的第一个1,用bsf, AT& T汇编(gcc汇编)可以这样做:1// bit scan forward for 64 bit integral number2/* ============================================ */3inlineintbsf_asm (uint64_t w)4{5intx1, x2;6asm ("bsf %0,%0\n" "jnz 1f\n" "bsf %1,%0\n" "jz 1f\n" "addl $32,%0\n"7"1:": "=&q;" (x1), "=&q;" (x2):"1" ((int) (w >> 32)),8"0" ((int) w));9returnx1;10}如果用C来实现的话,那就有点麻烦
...
继续阅读
(16)