ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

²éÕÒÒ»¸ö64λÕûÊý¶þ½øÖƵÚÒ»¸ö1 (Ò»)
2014-11-23 23:11:45 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1´Î
Tags£º²éÕÒ Ò»¸ö 64λ ÕûÊý¶þ½øÖÆ

ÓÐʱºòÓõ½Î»ÔËËã¡£ÐèÒª¿ìËÙÕÒµ½Ò»¸öÕûÊýµÄ¶þ½øÖƵÚÒ»¸ö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 number
2 /* ============================================ */
3 inline int bsf_asm (uint64_t w)
4 {
5 int x1, x2;
6 asm ("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));
9 return x1;
10 }


Èç¹ûÓÃCÀ´ÊµÏֵϰ£¬ÄǾÍÓеãÂé·³ÁË£¬Ôڴ˲»½²¸´ÔÓµÄÊýѧԭÀí£¬½ö½ö¸ø³ö´úÂë¡£

1 // bit scan forward for 64 bit integral number
2 /* ============================================ */
3 inline int bsf_folded (uint64_t bb)
4 {
5 static const int lsb_64_table[64] =
6 {
7 63, 30, 3, 32, 59, 14, 11, 33,
8 60, 24, 50, 9, 55, 19, 21, 34,
9 61, 29, 2, 53, 51, 23, 41, 18,
10 56, 28, 1, 43, 46, 27, 0, 35,
11 62, 31, 58, 4, 5, 49, 54, 6,
12 15, 52, 12, 40, 7, 42, 45, 16,
13 25, 57, 48, 13, 10, 39, 8, 44,
14 20, 47, 38, 22, 17, 37, 36, 26
15 };
16 unsigned int folded;
17 bb ^= bb - 1;
18 folded = (int) bb ^ (bb >> 32);
19 return lsb_64_table[folded * 0x78291ACF >> 26];
20 }


Èç¹ûÏë´ÓºóÍùǰËÑË÷Ò»¸öÕûÊýµÄ¶þ½øÖƵÚÒ»¸ö1µÄϱ꣬Óûã±à¿ÉÒÔÕâÑù×ö¡£

1 // bit scan in reverse order for 64 bit integral number
2 /* ============================================ */
3 inline int bsr_asm (uint64_t w)
4 {
5 int x1, x2;
6 asm ("bsr %1,%0\n" "jnz 1f\n" "bsr %0,%0\n" "subl $32,%0\n"
7 "1: addl $32,%0\n": "=&q" (x1), "=&q" (x2):"1" ((int) (w >> 32)),
8 "0" ((int) w));
9 return x1;
10 }


Èç¹ûÓÃCÀ´ÊµÏֵϰ£¬Ò²±È½Ï¼òµ¥£¬ÓÃdivide and conquer µÄÔ­Àí¾Í²»»áÌ«Âý¡£

1 // a logn (n == 32)algorithm for bit scan in reverse order
2 /* ============================================ */
3 inline int bsr32(uint32_t bb)
4 {
5 static const char msb_256_table[256] =
6 {
7 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
8 4, 4, 4, 4, 4, 4, 4, 4,4, 4, 4, 4,4, 4, 4, 4,
9 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
11 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
12 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
13 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
14 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
15 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
16 };
17 int result = 0;
18
19 if (bb > 0xFFFF)
20 {
21 bb >>= 16;
22 result += 16;
23 }
24 if (bb > 0xFF)
25 {
26 bb >>= 8;
27 result += 8;
28 }
29
30 return (result + msb_256_table[bb]);
31 }
32
33 /* ============================================ */
34 inline int bsr_in_C(uint64_t bb)
35 {
36 const uint32_t hb = bb >> 32;
37 return hb 32 + bsr32((uint32_t)hb) : bsr32((uint32_t)bb);
38
39 }
40


ÏÂÃæÕâ¸öËÆºõÒ²¿ÉÒÔ£¬Ê§°Üʱ·µ»Ø-1023£¬ÖÁÓÚËÙ¶È¿ìÂý¾ÍÒª¿´±àÒëÆ÷µÄÊȺÃÁË¡£

1 // bit scan in reverse order for 64 bit integral number
2 /* ============================================ */
3 inline int bsr_double (uint64_t bb)
4 {
5 union
6 {
7 double d;
8 struct
9 {
10 unsigned int mantissal : 32;
11 unsigned int mantissah : 20;
12 unsigned int exponent : 11;
13

Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºÓÐЧµÄʹÓúÍÉè¼ÆCOMÖÇÄÜÖ¸Õë¨DÌ.. ÏÂһƪ£ºmin(x,y)¸ßЧËã·¨

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ: