user-0 提问: 算法求解，是牛人过来看看吧。

回复:
user: user-1
content: 引用 28 楼 DelphiGuy 的回复:[quote=引用 26 楼 zhao4zhong1 的回复:] 验证到底循环多少次，查表法的速度才刚赶上带进位循环法，其实很简单，将你的初始化表的代码放到循环中。  我为什么要把初始化表的代码放到循环中？那是静态数据，完全可以： static unsigned short LookupTable[256] = {0x0000, 0x0002, 0x0008,...}; 我用一个初始化函数，是为了减少回帖的字数，你滴明白。 引用 27 楼 zhao4zhong1 的回复:我就不信，一次循环的时候，查表法的速度也比带进位循环法快。  没错，把你的代码中两处mov ecx,16都改成mov ecx,1，仍然比查表法慢1/4。  [/quote] 静态数据初始化不需要执行时间的深（qian）奥（xian）道理偶还是明白滴。

user: user-2
content: 我的大体思路如下：   	for(i=15;i>=0;i--) 	{ 		if((1<<i)&X) 			ZLow|=(1<<((i<<1)+1)); 		if((1<<i)&Y) 			ZLow|=(1<<(i<<1));		 		if((1<<(i+16))&X) 			ZHigh|=(1<<((i<<1)+16+1)); 		if((1<<(i+16))&Y) 			ZHigh|=(1<<((i<<1)+16));				 	}

user: user-3
content: 我实在没看懂你想问什么  64位的数据是什么意思 你直接开辟一个2倍大小的数组然后按序交错插入有什么问题

user: user-4
content: 引用 26 楼 zhao4zhong1 的回复:验证到底循环多少次，查表法的速度才刚赶上带进位循环法，其实很简单，将你的初始化表的代码放到循环中。  我为什么要把初始化表的代码放到循环中？那是静态数据，完全可以： static unsigned short LookupTable[256] = {0x0000, 0x0002, 0x0008,...}; 我用一个初始化函数，是为了减少回帖的字数，你滴明白。 引用 27 楼 zhao4zhong1 的回复:我就不信，一次循环的时候，查表法的速度也比带进位循环法快。  没错，把你的代码中两处mov ecx,16都改成mov ecx,1，仍然比查表法慢1/4。

user: user-1
content: 甚至在比如不超过128次的前提下，查表法的效率都可能要低于带进位循环移位法。

user: user-1
content: 引用 20 楼 DelphiGuy 的回复:[quote=引用 19 楼 zhao4zhong1 的回复:] [quote=引用 18 楼 DelphiGuy 的回复:] 抱歉，还真没找到，连6502、8031这种档次的CPU都有循环移位指令。不过在低端处理器上循环移位指令可能会更慢（尤其带进 位循环）。 “8次寄存器循环移位指令”比“1或2次读写内存指令“慢。涨姿势了。[/quote]  1. 在cache命中的情况下，“8次寄存器循环移位指令”肯定比“1或2次读写内存指令“慢，尤其是带进位循环移位。 2. 你的算法用了128次rcl，我的算法用了8次内存读+10次移位+10次逻辑操作，你说哪个快？ 3. 很明显我说的意思是在低端处理器上用循环移位指令实现的算法很可能比查表法慢得更多（相对于PC上的两者速度比）。 [/quote] 略扫一下您老的兴： 如果只计算一次，你的算法需要加上构造查找表的指令，再加上查找表多占的内存，你是不是得承认还是我的办法效率最高？ 顺便要回一丁点我已经丢了的面子（尽管面子不值什么钱和积分）？

user: user-1
content: 我就不信，一次循环的时候，查表法的速度也比带进位循环法快。

user: user-1
content: 引用 23 楼 DelphiGuy 的回复:[quote=引用 21 楼 zhao4zhong1 的回复:] [quote=引用 20 楼 DelphiGuy 的回复:] [quote=引用 19 楼 zhao4zhong1 的回复:] [quote=引用 18 楼 DelphiGuy 的回复:] 抱歉，还真没找到，连6502、8031这种档次的CPU都有循环移位指令。不过在低端处理器上循环移位指令可能会更慢（尤其带进 位循环）。 “8次寄存器循环移位指令”比“1或2次读写内存指令“慢。涨姿势了。[/quote]  1. 在cache命中的情况下，“8次寄存器循环移位指令”肯定比“1或2次读写内存指令“慢，尤其是带进位循环移位。 2. 你的算法用了128次rcl，我的算法用了8次内存读+10次移位+10次逻辑操作，你说哪个快？ 3. 很明显我说的意思是在低端处理器上用循环移位指令实现的算法很可能比查表法慢得更多（相对于PC上的两者速度比）。 [/quote] 略扫一下您老的兴： 如果只计算一次，你的算法需要加上构造查找表的指令，再加上查找表多占的内存，你是不是得承认还是我的办法效率最高？ 顺便要回一丁点我已经丢了的面子（尽管面子不值什么钱和积分）？ [/quote]  查找表是静态的，只需要初始化一次，也可以直接写成初始化数据，我之所以用一个初始化函数，是为了缩短代码，查找表的512字节写成文本有将近 2KB（算上0x前缀和逗号、空格）。你的代码效率太低，没有可比性。 [/quote] 验证到底循环多少次，查表法的速度才刚赶上带进位循环法，其实很简单，将你的初始化表的代码放到循环中。

user: user-4
content: 引用 22 楼 zhao4zhong1 的回复:甚至在比如不超过128次的前提下，查表法的效率都可能要低于带进位循环移位法。  似乎你要表达的意思和你的描述之间并不一致。  rcl/rcr是慢指令，尤其是移多位的情况下，诸如rcl reg,n、rcl reg,cl这样的指令，8条就赶得上查表法整个代码的时间了。你闲得没事干也可以试一试。

user: user-5
content: 引用 9 楼 sholber 的回复:有两个相同元素个数的数组，把这两个数组的元素按位插入，得到新的数组。例如：数组a第一个元素为10，数组b第一个元素为5。数组为int型。那么换算成二进制10为0000 0000 0000 0000 0000 0000 0000 1010.  5的二进制为0000 0000 0000 0000 0000 0000 0000 0101. 按算法规则插入后为。0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 1001.    [quote=引用 2 楼 my_live_123 的回复:] 蛮力法：  for(i = 0; i < 32; ++i) result |= (((a >> i) & 0x1) << (2 * i + 1) ) | (((b >> i) & 0x1) << 2 * i  )   有几个问题： 1，将int视为32位是否安全，是否可移植； 2，int在有些机器上可能有填充比特（padding bits），你们这么武断地移来移去是否安全，是否是可移植的？ 3，因为是int，如果最高位是1，>>运算符的行为是否是未定义的？ 不先回答这些问题，怎么搞都没有意义了。[/quote]  你的问题很有价值，这些问题的确需要进一步考虑，谢谢！  这两句姑且认为是伪代码！我只是把数学公式改写成这个样子！

user: user-4
content: 引用 21 楼 zhao4zhong1 的回复:[quote=引用 20 楼 DelphiGuy 的回复:] [quote=引用 19 楼 zhao4zhong1 的回复:] [quote=引用 18 楼 DelphiGuy 的回复:] 抱歉，还真没找到，连6502、8031这种档次的CPU都有循环移位指令。不过在低端处理器上循环移位指令可能会更慢（尤其带进 位循环）。 “8次寄存器循环移位指令”比“1或2次读写内存指令“慢。涨姿势了。[/quote]  1. 在cache命中的情况下，“8次寄存器循环移位指令”肯定比“1或2次读写内存指令“慢，尤其是带进位循环移位。 2. 你的算法用了128次rcl，我的算法用了8次内存读+10次移位+10次逻辑操作，你说哪个快？ 3. 很明显我说的意思是在低端处理器上用循环移位指令实现的算法很可能比查表法慢得更多（相对于PC上的两者速度比）。 [/quote] 略扫一下您老的兴： 如果只计算一次，你的算法需要加上构造查找表的指令，再加上查找表多占的内存，你是不是得承认还是我的办法效率最高？ 顺便要回一丁点我已经丢了的面子（尽管面子不值什么钱和积分）？ [/quote]  查找表是静态的，只需要初始化一次，也可以直接写成初始化数据，我之所以用一个初始化函数，是为了缩短代码，查找表的512字节写成文本有将近 2KB（算上0x前缀和逗号、空格）。你的代码效率太低，没有可比性。

user: user-4
content: 引用 19 楼 zhao4zhong1 的回复:[quote=引用 18 楼 DelphiGuy 的回复:] 抱歉，还真没找到，连6502、8031这种档次的CPU都有循环移位指令。不过在低端处理器上循环移位指令可能会更慢（尤其带进 位循环）。 “8次寄存器循环移位指令”比“1或2次读写内存指令“慢。涨姿势了。[/quote]  1. 在cache命中的情况下，“8次寄存器循环移位指令”肯定比“1或2次读写内存指令“慢，尤其是带进位循环移位。 2. 你的算法用了128次rcl，我的算法用了8次内存读+10次移位+10次逻辑操作，你说哪个快？ 3. 很明显我说的意思是在低端处理器上用循环移位指令实现的算法很可能比查表法慢得更多（相对于PC上的两者速度比）。

user: user-1
content: 引用 18 楼 DelphiGuy 的回复:抱歉，还真没找到，连6502、8031这种档次的CPU都有循环移位指令。不过在低端处理器上循环移位指令可能会更慢（尤其带进 位循环）。 “8次寄存器循环移位指令”比“1或2次读写内存指令“慢。涨姿势了。

user: user-4
content: 抱歉，还真没找到，连6502、8031这种档次的CPU都有循环移位指令。不过在低端处理器上循环移位指令可能会更慢（尤其带进 位循环）。

user: user-1
content: http://bbs.csdn.net/topics/390966967

user: user-1
content: 引用 6 楼 DelphiGuy 的回复:楼主说的是单片机，您这x86汇编十有八九是不能用的，虽然确实有x86兼容的SOCs，AMD Geode、intel Quark之类的，不过估计楼主的单片机不会是这一类。 单片机没有带进位的循环移位指令，谁信呢？

user: user-6
content: 解决之道是使用unsigned char类型的数组，因为unsigned char和signed char是保证没有填充比特的。唯一需要注意的问题是字节的比特数，当然，你可以假定CHAR_BIT == 8。

user: user-7
content: 俺这个连新数组都省了,新数据直接存在了老数组里 再弄个解密还原的就完整了

user: user-7
content: 不知道俺这么老实的算法入不入得了楼主的法眼 void  ToPassword(long *n1,long *n2) { 	if(n1==NULL||n2==NULL)  		return;  	long H=0,L=0;  	for(int i=15;i>=0;i--) 	{ 		H|=(*n1>>(16+i))&1; 		H<<=1; 		H|=(*n2>>(16+i))&1;  		L|=(*n1>>i)&1; 		L<<=1; 		L|=(*n2>>i)&1;  		if(i>0)  		{ 			H<<=1; 			L<<=1; 		} 	} 	*n1=H; 	*n2=L; }  应用: long  Num1[100]={....}; long  Num2[100]={....};  for(int i=0;i<100;i++) ToPassword(&Num1[i],&Num2[i]);

user: user-1
content: 引用 15 楼 DelphiGuy 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 DelphiGuy 的回复:] 楼主说的是单片机，您这x86汇编十有八九是不能用的，虽然确实有x86兼容的SOCs，AMD Geode、intel Quark之类的，不过估计楼主的单片机不会是这一类。 单片机没有带进位的循环移位指令，谁信呢？[/quote]  可能有，也可能没有，你不能假定是x86。 [/quote] 求教育，举一个不支持“带进位循环移位指令”的CPU型号。 我觉得“带进位循环移位指令”应该是CPU的标配吧。