一段代码看不懂,哪位能帮忙解释一下实现什么算法?

efaneda 2009-03-30 05:31:54
代码如下,哪位能帮忙解释一下,谢谢

/* Seal's algorithm with multiply expanded.
9 elementary ops plus an indexed load. */

int ntz8a( unsigned x )
{

static char table[64] = {32, 0, 1,12, 2, 6, u,13,
3, u, 7, u, u, u, u,14, 10, 4, u, u, 8, u, u,25,
u, u, u, u, u,21,27,15, 31,11, 5, u, u, u, u, u,
9, u, u,24, u, u,20,26, 30, u, u, u, u,23, u,19,
29, u,22,18, 28,17,16, u};

x = ( x & -x );
x = ( x<<4 ) + x; /* x = x*17. */
x = ( x<<6 ) + x; /* x = x*65. */
x = ( x<<16 ) - x; /* x = x*65535. */
return table[ x>>26 ];
}
...全文
243 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphaxiang 2009-04-11
  • 打赏
  • 举报
回复
呵呵,不知道对不对.我自己的证明.
http://user.qzone.qq.com/414353346/blog/1239382608
这里有我自己的详细证明过程.
alphaxiang 2009-04-11
  • 打赏
  • 举报
回复
用同余的思路证明:
令K=x&-x; 则K=2^n; n+1是x的32位二进制表示中最低的为1那位的位置。
例如: x=00111110001110010110001011000000;-x的二进制表示为x的各位取反加一。
所以 -x=11000001110001101001110101000000;所以x&-x的二进制表示为
x&-x=00000000000000000000000001000000; 2^6;
因此任何32位数经过x&-x都转换为一个2^n形式的数。(0=<n<32)我们需要证明对任何两个n1与n2对应的2^n1与2^n2经过算法中的一系列运算后不会发生碰撞。
证明如下: (注意所有运算结果被限制在32位内。即相当于每次运算结果对2^32求余)
令k=2^n (0=<n<32)
则 x=(x<<4)+x相当于
x=[(16*k)mod 2^32 + k mod 2^32 ] mod 2^32;
由同余等式 (A mod K + B mod K)=(A+B)mod K 可得:
x=(17*k) mod 2^32;
同理 x=(x<<6)+x可表示为
x={[(17*k mod 2^32 )*64] mod 2^32 +17*k mod 2^32 } mod 2^32
由同余等式 [(A mod K)* (B mod K)]=(A*B)mod K 可得:第二次移位累加后
x=(17*65*k)mod 2^32;
同理,经过第三次移位累加后
x=(17*65*65535*k) mod 2^32
最后一步用来得出索引 index = x>>26
对任意K1与K2
X1=(72416175*K1)mod 2^32;X2=(72416175*K2)mod 2^32;
X1>>26=(72416175*K1*2^-26) mod 2^6; X2>>26=(72416175*K2*2^-26) mod 2^6;
令Ki*2^-26=Pi;
则 2^-26=<<Pi<2^6;
若X1>>26=X2>>26则
72416175*P1 ≡72416175*P2 mod 2^6
即 2^6|72416175*(P1-P2)
但是 2^6 与72516175互素;2^6也不能整除P1-P2;
故 2^672416175*(P1-P2)
即X1>>26≠X2>>26;
命题得证
Evil_cloud 2009-04-04
  • 打赏
  • 举报
回复
return table[x>>26] 其实就是return table[x&-x]
所以当x为奇数时,-x&x恒为1 输出结果恒为0
acdbxzyw 2009-04-03
  • 打赏
  • 举报
回复
顶!
xiguagege 2009-04-03
  • 打赏
  • 举报
回复
mark
yegoo 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 solarsail 的回复:]
据说是求二进制数尾零个数用的(也可以说是第一个被置1的位的位置)。
由David Seal于1994年发表,原始版本是arm的汇编

> ; Operand in R0, register R1 is free, R2 addresses a byte table 'Table'
>
> RSB R1,R0,#0 ;Standard trick to isolate bottom bit in R1,
> AND R1,R1,R0 ; or produce zero in R1 if R0 = 0.
>
> ORR R1,R1,R1,LSL #4 ;If R1=X with 0 …
[/Quote]
强!
efaneda 2009-03-30
  • 打赏
  • 举报
回复
ls 的兄弟太强了,佩服啊
solarsail 2009-03-30
  • 打赏
  • 举报
回复
据说是求二进制数尾零个数用的(也可以说是第一个被置1的位的位置)。
由David Seal于1994年发表,原始版本是arm的汇编

> ; Operand in R0, register R1 is free, R2 addresses a byte table 'Table'
>
> RSB R1,R0,#0 ;Standard trick to isolate bottom bit in R1,
> AND R1,R1,R0 ; or produce zero in R1 if R0 = 0.
>
> ORR R1,R1,R1,LSL #4 ;If R1=X with 0 or 1 bits set, R0 = X * &11
> ORR R1,R1,R1,LSL #6 ;R0 = X * &451
> RSB R1,R1,R1,LSL #16 ;R1 = X * &0450FBAF
>
> LDRB R1,[R2,R1,LSR #26] ;Look up table entry indexed by top 6 bits
> ; of R1
>
> ; Result in R1

详见http://www.ciphersbyritter.com/NEWS4/BITCT.HTM#7486oe$jua@sis.cambridge.arm.com
无天 2009-03-30
  • 打赏
  • 举报
回复
先顶一个。好像跟数论中的同余有关。
efaneda 2009-03-30
  • 打赏
  • 举报
回复
补充一下 #define u 99

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧