寻求最快解决方案
Aug 31, 2005
有两个Ulong的数L1和L2,需要将L1的第n位(bit)设置成L2的第m位(bit)。
比如L1为(binary)10101000010…..(共64位,Low ->High),L2为(binary)0101110001….(共64位Low ->High),设置L1的第3位(现在是1)为L2的第1位(现在是0)。
我写了一个算法,但是发现速度不快(用在加密算法里面),大部分时间消耗在判断上了。不知道各位能不能写出速度更快的代码,或者有其他优化技巧。以下是我写的算法,大家看看……期待着大家的回答。谢谢!
Private Const ULong_1 As ULong = CType(1, ULong) '全部是1的ULong |
经过苦思冥想,问题解决:
Sub SetBit()Sub SetBit(ByRef L1 As ULong, ByVal n As Integer, ByRef L2 As ULong, ByVal m As Integer) |
现在执行1000000次也只需要31.25ms,速度已经达到要求了。
思路如下:
思 路为把L2中的m那一位移到最右边,然后和1取AND,这样就把m这位取出来了。对于L1,我把n这一位设置为0,也就是AND 111111..0…111这样,111111..0…111来自1<<n然后取反。最后把L1中取得的那一位和L2 AND以后的值相加即可。