- 论坛徽章:
- 0
|
原帖由 cookis 于 2008-8-25 13:01 发表
我想要的是公式..
不想用函数或循环之类的方法.
一句话搞定的方法.
一句可以搞定的方法?有,x86下一条指令就可以了,'bsf xxx, xxx'
看看内核是怎么做的:
封装了一下:
- static inline unsigned long __ffs(unsigned long word)
- {
- if ( !word )
- return -1;
-
- asm("bsf %1,%0"
- : "=r" (word)
- : "rm" (word));
-
- return word;
- }
复制代码
不用指令的方法,就不是一句了,当然你可以可以把它们写成一句,不过我想没有这么多一句就搞定的事情。
- /**
- * __ffs - find first bit in word.
- * @word: The word to search
- *
- * Undefined if no bit exists, so code should check against 0 first.
- */
- static inline unsigned long __ffs(unsigned long word)
- {
- int num = 0;
- #if BITS_PER_LONG == 64
- if ((word & 0xffffffff) == 0) {
- num += 32;
- word >>= 32;
- }
- #endif
- if ((word & 0xffff) == 0) {
- num += 16;
- word >>= 16;
- }
- if ((word & 0xff) == 0) {
- num += 8;
- word >>= 8;
- }
- if ((word & 0xf) == 0) {
- num += 4;
- word >>= 4;
- }
- if ((word & 0x3) == 0) {
- num += 2;
- word >>= 2;
- }
- if ((word & 0x1) == 0)
- num += 1;
- return num;
- }
复制代码 |
|