欢迎您来到芯片的主页!

Welcome to Chipset's homepage!

using gcc_x86 assembly to scan the most significant one bit and the least significant one bit

原来发过搜索第一位的帖子,这次算再补充一下吧。以下取自网络,作者不详。
 1 #ifdef __GNUC__
 2 
 3 #if (defined _WIN64 || defined __x86_64__)
 4 
 5 /**
 6  * ../bit_scan_forward
 7  * @return index (0..63) of least significant one bit
 8  */
 9 unsigned bit_scan_forward(unsigned long long x)
10 {
11    asm("bsfq %0, %0" : "=r" (x) : "0" (x));
12    return unsigned(x);
13 }
14 
15 /**
16  * bit_scan_reverse
17  * @return index (0..63) of most significant one bit
18  */
19 unsigned bit_scan_reverse(unsigned long long x)
20 {
21    asm("bsrq %0, %0" : "=r" (x) : "0" (x));
22    return unsigned(x);
23 }
24 
25 #elif (defined _WIN32) || (defined __linux__)
26 
27 /**
28  * ../bit_scan_forward
29  * @return index (0..63) of least significant one bit
30  */
31 unsigned bit_scan_forward(unsigned long long x)
32 {
33    asm("bsf %0, %0" : "=r" (x) : "0" (x));
34    return unsigned(x);
35 }
36 
37 /**
38  * bit_scan_reverse
39  * @return index (0..63) of most significant one bit
40  */
41 unsigned bit_scan_reverse(unsigned long long x)
42 {
43    asm("bsr %0, %0" : "=r" (x) : "0" (x));
44    return unsigned(x);
45 }
46 
47 #endif
48 
49 #endif

posted on 2014-06-15 17:38 Chipset 阅读(180) 评论(0)  编辑 收藏 引用 所属分类: 算法和数据结构消遣转载


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理