请问两个字符“按位与”和相减,哪个速度快?

wisec 2002-08-12 04:41:38
大量地把单个十六进制数字字符转成数值,其中字符 c 在 0-9 范围的时候,一般的方法是 c - '0' ,即字符的 ASCII 值减去 '0' 的 ASCII 值,今天想到用位运算 c & 0x0F 也能得到正确的结果,请问这两个方法哪个速度快?(因为转换量大,所以速度要求高。)
此外 A - F 怎样转换速度最快?(*str & 0x40) ? (*str & 0xDF) - 'A' + 10 怎样?
...全文
194 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
awinder 2002-08-12
  • 打赏
  • 举报
回复
看看反编译的结果:
#KUAI#9: *pl=((*str & 0x40) ? (*str & 0x1f)+9 : *str & 0x0f)<<4;
cs:02F6 8B5EFA mov bx,[bp-06]
cs:02F9 F60740 test byte ptr [bx],40
cs:02FC 740B je 0309
cs:02FE 8B5EFA mov bx,[bp-06]
cs:0301 8A07 mov al,[bx]
cs:0303 241F and al,1F
cs:0305 0409 add al,09
cs:0307 EB07 jmp 0310
cs:0309 8B5EFA mov bx,[bp-06]
cs:030C 8A07 mov al,[bx]
cs:030E 240F and al,0F
cs:0310 C0E004 shl al,04
cs:0313 8B5EFC mov bx,[bp-04]
cs:0316 8807 mov [bx],al
#KUAI#10: *pl=((*str>='A')?(*str & 0xdf)-'a'+10:*str-'0')*16;
cs:0318 8B5EFA mov bx,[bp-06]
cs:031B 803F41 cmp byte ptr [bx],41
cs:031E 720B jb 032B
cs:0320 8B5EFA mov bx,[bp-06]
cs:0323 8A07 mov al,[bx]
cs:0325 24DF and al,DF
cs:0327 04A9 add al,A9
cs:0329 EB07 jmp 0332
cs:032B 8B5EFA mov bx,[bp-06]
cs:032E 8A07 mov al,[bx]
cs:0330 04D0 add al,D0
cs:0332 C0E004 shl al,04
cs:0335 8B5EFC mov bx,[bp-04]
cs:0338 8807 mov [bx],al

比较一下,不难发现,你的方法和旧方法几乎一模一样,没有差别,而且你的方法看起来比较难懂,不能称为好程序。

另外,说明一下,在计算机中位运算指令和算术运算指令(加减法)的指令周期时一样的,你可以比较一下几个指令周期表。

wisec 2002-08-12
  • 打赏
  • 举报
回复
非常感谢各位兄弟的指导,刚才分析一下,这个方法最理想:
*pl = ( (*str & 0x40) ? (*str & 0x1F) + 9 : *str & 0x0F ) << 4;
解说:
& 0x0F 00001111 - '0' ,取得数字字符的数值。
& 0x40 00111111 - '@' ,判断是否字母。
& 0xDF 11011111 变大写(0x5F 01011111 也可以)
& 0x1F 00011111 变大写 - @
+ 9 最后取得字母的数值
旧算法:*pl = ( (*str >= 'A') ? (*str & 0xDF) - 'A' + 10 : *str - '0' ) * 16;
下次用lanfengjiyue提示的方法测试一下。
哪位兄弟有更好的方法请指导。谢谢。
bonoji() 您指的是编译时的速度,编译后程序运行时位运算和减法速度差别大么?
不懂编译原理确实不算顶级的程序员。 :)
耙子 2002-08-12
  • 打赏
  • 举报
回复
现在的编译器都有优化的功能了。
类似
int a=100;
b= a /2; 编译器会自动变成 b= a >> 2;
你没必要自己操心了。
为了阅读方便,你用 a/2肯定好理解些。
lanfengjiyue 2002-08-12
  • 打赏
  • 举报
回复
位运算快
你可以测试一下啊
用time.h里的函数,具体我记不起来了
bonoji 2002-08-12
  • 打赏
  • 举报
回复
应该是位操作的快,因为二进制是电脑的母语,编译时少了转化,不过对你来说这点差巨都一样.
dsft 2002-08-12
  • 打赏
  • 举报
回复
我认为是位运算的快时钟周短吗
不知对不对
你查一查
ASM的书就知道了

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧