| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2252 人关注过本帖
标题:刚看到一个题目,觉有很有趣
只看楼主 加入收藏
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
int fun2(int n)
{
    unsigned char *p;
    p = (unsigned char *)&n;
    return table[p[0]] + table[p[1]] + table[p[2]] + table[p[3]];
}
对于这个程序,我分析时也说了,按理来说应该是时间最少的,编译后只有 mov 和 add 指令。
对于C来说,可 unsigned char 可以直接从long(C里面是 int )转成byte(C里是 Char )数组。
对VB6而说,要么使用除法慢慢算,要么调用API函数复制内存,开销超大。所以 VB6 在这里就出现很奇怪的事。
至于9楼的算法,我还要晚上慢慢琢磨一下。

授人于鱼,不如授人于渔
早已停用QQ了
2021-09-13 15:19
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
cs=cs and (cs-1)
弄清楚了意思了。
减掉1后,
有二种情况,一种是末位为1,一种是末位为0的。
1、末位为1的,减1后,末位变0,其他位不变,AND后,清掉了末位1。
2、末位为0的,减1后,最后一个1变成0,这之后的0都变成1,与原数AND后,这位及后面位也全部清为0了。这种情况下,实际是统计了这位的1。
循环。
是效率高很多。

循环调用10000000次,计时间
方法一用时:0.2890625
方法四用时:61.69531
方法六用时:0.203125  (9楼方法,本楼代码)

程序代码:
Public Function CountOne6(cs As Long) As Long
Dim k As Long
Dim j As Long
k = cs
j = 0
Do While k > 0
        k = k And (k - 1)
        j = j + 1
Loop
CountOne6 = j
End Function


[此贴子已经被作者于2021-9-13 18:41编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2021-09-13 18:32
ladin
Rank: 1
来 自:北京
等 级:新手上路
帖 子:10
专家分:3
注 册:2021-8-11
收藏
得分:0 
这个对我来说太高大上了
2021-09-14 08:29
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
高版本VB支持位移应该还可优化
2021-09-14 15:34
you157827715
Rank: 3Rank: 3
来 自:湖南
等 级:论坛游侠
威 望:1
帖 子:43
专家分:121
注 册:2021-4-24
收藏
得分:0 
感觉太复杂了,不怎么理解!
2021-09-15 13:09
快速回复:刚看到一个题目,觉有很有趣
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018864 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved