标题:[讨论]关于位运算那种方案效率高
取消只看楼主
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
 问题点数:0 回复次数:5 
[讨论]关于位运算那种方案效率高

我写了两个程序,程序的功能都是一样的,对于一个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
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 

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


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-29 18:20
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
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
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 
以下是引用SunShining在2006-6-29 18:31:40的发言:
对.每一个位都要'与'一下.

好的谢谢你,我想我学到不少。


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-29 18:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-75712-1-1.html




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

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