乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 100|回复: 2

[编程交流] Req 一个关于 caculate 或 bit 操作的高效脚本

[复制链接]

3

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
18
发表于 2022-7-13 10:41:17 | 显示全部楼层 |阅读模式
目前我正在做一些需要使用高效脚本的项目
部分脚本如下所示
  1.       (setq _j
  2.         (Boole 6
  3.           (rem (/ _i 256) 256)
  4.           (rem (/ (/ _i 256) 256) 256)
  5.           (rem (/ (/ (/ _i 256) 256) 256) 256)
  6.         )
  7.       )
我正在尝试优化它,使用位操作方式
  1.       (setq _j
  2.         (Boole 6
  3.           (lsh (lsh (lsh _i -8) 24) -24)
  4.           (lsh (lsh (lsh _i -16) 16) -16)
  5.           (lsh (lsh (lsh _i -24) 8) -8)
  6.         )
  7.       )
这似乎需要更多的时间来计算
完整的脚本是
  1. (defun c:tt3()
  2.   (setq TIME0 (getvar "millisecs"))
  3.   (repeat 3
  4.     (setq _i 1)
  5.     (setq nl '())
  6.     (while (
  7.       (setq _j
  8.         (Boole 6
  9.           (rem (/ _i 256) 256)
  10.           (rem (/ (/ _i 256) 256) 256)
  11.           (rem (/ (/ (/ _i 256) 256) 256) 256)
  12.         )
  13.       )
  14.       (setq nl (cons _j nl))
  15.       (setq _i (1+ _i))
  16.     )
  17.   )
  18.   (princ "\nrem require")
  19.   (print (/ (- (getvar "millisecs") TIME0 0.0) 1000.0))
  20.   (setq TIME0 (getvar "millisecs"))
  21.   (repeat 3
  22.     (setq _i 1)
  23.     (setq nl '())
  24.     (while (
  25.       (setq _j
  26.         (Boole 6
  27.           (lsh (lsh (lsh _i -8) 24) -24)
  28.           (lsh (lsh (lsh _i -16) 16) -16)
  29.           (lsh (lsh (lsh _i -24) 8) -8)
  30.         )
  31.       )
  32.       (setq nl (cons _j nl))
  33.       (setq _i (1+ _i))
  34.     )
  35.   )
  36.   (princ "\nlsh require")
  37.   (print (/ (- (getvar "millisecs") TIME0 0.0) 1000.0))
  38.   (princ)
  39. )

并且输出是
rem要求
6.296
lsh要求
22.047
是任何人都可以优化它

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
18
发表于 2022-7-13 17:38:18 | 显示全部楼层
我不确定你的两种方法是否完全等价...你想这样做吗?
  1. (defun f1 ( _i )
  2.     (boole 6
  3.         (lsh (lsh _i 16) -24)
  4.         (lsh (lsh _i  8) -24)
  5.         (lsh _i -24)
  6.     )
  7. )

如果是这样,这里有几个替代方案:
  1. (defun f2 ( _i )
  2.     (boole 6
  3.         (lsh (logand _i    65280)  -8)
  4.         (lsh (logand _i 16711680) -16)
  5.         (lsh _i -24)
  6.     )
  7. )
  1. (defun f3 ( _i )
  2.     (lsh (boole 6 (lsh _i 16) (lsh _i 8) _i) -24)
  3. )
回复

使用道具 举报

3

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
18
发表于 2022-7-14 11:37:02 | 显示全部楼层
是的,你说得对。
我尝试对除低8位之外的每个8位进行xor运算。
set _i项目是一个32位的整数。
我将25-32位、17-24位、9-16位进行异或运算,得到一个8位结果,并将其赋给_j项。
f1、f2、f3运行良好。它完成了工作,
但仍需提高效率。
在我的电脑中。
calculate _i从1到1148576。f1用了5.2秒~ 5.4秒,
f2用了4.2秒~ 5.2秒,
f3用了3.4秒~ 3.7秒,但是作为第一层后的参考方法,
它用了2.2秒~ 2.3秒。
欢迎任何知道如何有效使用脚本或其他方法来完成工作的人。Thx。
提示。65280 FF00 16711680 ff 0000
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 01:09 , Processed in 0.405377 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表