| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1864 人关注过本帖
标题:[讨论]关于位运算那种方案效率高
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:13 
[讨论]关于位运算那种方案效率高

我写了两个程序,程序的功能都是一样的,对于一个byte(unsigned char)类型,申明一个变量,给变量赋值'a',取其高4位和低4位的值,分别存入bH和bL变量,请各位高手各抒己见,看看那种方案效率高,如果能提出更好的方案,请不吝赐教,谢谢!

方案一源代码:
/* BitOpr1.cpp */
#include <stdio.h>
#include <mem.h>

#define BYTE unsigned char

typedef struct {
BYTE bit0 : 1;
BYTE bit1 : 1;
BYTE bit2 : 1;
BYTE bit3 : 1;
BYTE bit4 : 1;
BYTE bit5 : 1;
BYTE bit6 : 1;
BYTE bit7 : 1;
} byte_t;

BYTE tbl[] = {0x08, 0x04, 0x02, 0x01};

inline
BYTE bitH(byte_t value) {
return value.bit7 * tbl[0] + value.bit6 * tbl[1] +
value.bit5 * tbl[2] + value.bit4 * tbl[3]
;
}

inline
BYTE bitL(byte_t value) {
return value.bit3 * tbl[0] + value.bit2 * tbl[1] +
value.bit1 * tbl[2] + value.bit0 * tbl[3]
;
}

int main() {
BYTE bH, bL;
byte_t c;
/* c = 'a' */
memset(&c,97,1);
/* fetch high bit and low bit */
bH = bitH(c);
bL = bitL(c);
/* output */
printf("%c : bH = %#x , bL = %#x\n",c,bH,bL);
return 0;
}


方案二源代码:
/* BitOpr2.cpp */
#include <stdio.h>

int main() {
unsigned char c = 97;
unsigned char bH, bL;
bH = c >> 4;
bL = (c << 4);
bL >>= 4;
printf("%c : bH = %#x bL = %#x\n",c,bH,bL);
return 0;
}

[此贴子已经被作者于2006-6-29 18:25:41编辑过]

搜索更多相关主题的帖子: 方案效率 BYTE 源代码 变量 运算 
2006-06-29 18:01
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 

[CODE]#include <stdio.h>
int main() {
unsigned char c = 97;
unsigned char bH, bL;
bH = c >> 4;
bL = bH&0x1;
printf("%c : bH = %#x bL = %#x\n",c,bH,bL);
return 0;
}[/CODE]

第一个我没细看.不过 'a'的第4位应该是0吧.而且我记得 位算制是 从0位开始的吧.

我倾向与位运算


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-29 18:16
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

我为运算不太熟,能解释一下bL = bH & 0x1什么意思吗?


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-29 18:20
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 
应该是第2个程序效率高点,开销也相对小于第1个程序。
移位操作是低级语言才有的,比如说汇编,而C是界于高低语言之间,也有移位操作。从效率上讲,移位操作明显高过你第1个程序调用那么多函数。从程序开销上讲,你第1个程序调用三个函数,函数调用的开销是比较大的,因为要申请栈,参数进栈出栈等。你第1个程序又定义了全局变量,全部变量一般情况下不要用,因为全部变量在程序中任何一个地方都是有效的,明显占用了较大的空间。

我的原则很简单:不做不喜欢的事!
2006-06-29 18:20
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
才看明白.是低4位..汗!

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-29 18:21
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 

我为运算不太熟,能解释一下bL = bH & 0x1什么意思吗?

除了最后一位外,把bH前面几位的数字清0。


我的原则很简单:不做不喜欢的事!
2006-06-29 18:22
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
以下是引用lj_860603在2006-6-29 18:20:24的发言:
应该是第2个程序效率高点,开销也相对小于第1个程序。
移位操作是低级语言才有的,比如说汇编,而C是界于高低语言之间,也有移位操作。从效率上讲,移位操作明显高过你第1个程序调用那么多函数。从程序开销上讲,你第1个程序调用三个函数,函数调用的开销是比较大的,因为要申请栈,参数进栈出栈等。你第1个程序又定义了全局变量,全部变量一般情况下不要用,因为全部变量在程序中任何一个地方都是有效的,明显占用了较大的空间。

可是我在第一程序中定义的两个函数都是以内联展开(inline),代码调用函数部分应该是直接用定义的函数中的语句取代吧,不过第一个程序取高低位都是以权位展开计算的,其中涉及到数组下界运算,可能慢一点。有没有办法接用汇编语言实现(我汇编不懂)


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-29 18:24
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
我以为他要第4位..

正如4楼所言.不用说汇编啦.就是你的调用函数就很浪费了!

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-29 18:25
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
以下是引用SunShining在2006-6-29 18:21:56的发言:
才看明白.是低4位..汗!

抱歉刚才打错了,现在改正了。


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-29 18:26
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
以下是引用lj_860603在2006-6-29 18:22:27的发言:

我为运算不太熟,能解释一下bL = bH & 0x1什么意思吗?

除了最后一位外,把bH前面几位的数字清0。

就是说,比如bH = 10001000
那么 bH & 0x1 就相当于 10001000 & 00000001 就是每一位都做一个与运算,是吗?

[此贴子已经被作者于2006-6-29 18:32:24编辑过]


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-29 18:29
快速回复:[讨论]关于位运算那种方案效率高
数据加载中...
 
   



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

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