设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 加入我们
搜索
查看: 7056|回复: 13
收起左侧

易语言长整数位运算模块源码 - 长整数实现左移右移位与位或位异或的方法

[复制链接]
发表于 2018-2-19 22:24:25 | 显示全部楼层 |阅读模式
核心库的位运算默认是整数型的,不支持长整数的位运算,使用该模块可以实现长整数的逻辑位运算。
截图.png



  1. .版本 2
  2. .支持库 spec

  3. .程序集 长整数位运算模块

  4. .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码


  5. _临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
  6. 返回 (0)  ' 可以根据您的需要返回任意数值

  7. .子程序 _临时子程序
  8. .局部变量 A, 整数型
  9. .局部变量 B, 整数型
  10. .局部变量 计数, 整数型

  11. ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
  12. 置随机数种子 ()
  13. .计次循环首 (10000, 计数)

  14.     A = 取随机数 (, ) × 取随机数 (, ) × 取随机数 (, )
  15.     B = 取随机数 (, ) × 取随机数 (, ) × 取随机数 (, )
  16.     A = 长整数取绝对值 (A)
  17.     B = 长整数取绝对值 (B)


  18.     .如果真 (位与 (A, B) ≠ 长整数位与 (A, B))
  19.         调试输出 (A, B)
  20.         暂停 ()
  21.     .如果真结束
  22.     .如果真 (位或 (A, B) ≠ 长整数位或 (A, B))
  23.         暂停 ()
  24.     .如果真结束
  25.     .如果真 (位异或 (A, B) ≠ 长整数位异或 (A, B))
  26.         暂停 ()
  27.     .如果真结束
  28.     A = 取随机数 (, )
  29.     B = 取随机数 (1, 16)
  30.     .如果真 (右移 (A, B) ≠ 长整数右移 (A, B))
  31.         暂停 ()
  32.     .如果真结束
  33.     .如果真 (左移 (A, B) ≠ 长整数左移 (A, B))
  34.         调试输出 (A, B, 左移 (A, B), 长整数左移 (A, B))
  35.         暂停 ()
  36.     .如果真结束

  37. .计次循环尾 ()


  38. .子程序 长整数取绝对值, 长整数型, 公开
  39. .参数 欲取其绝对值的数值, 长整数型

  40. .如果真 (欲取其绝对值的数值 < 0)
  41.     欲取其绝对值的数值 = 0 - 欲取其绝对值的数值
  42. .如果真结束
  43. 返回 (欲取其绝对值的数值)


  44. .子程序 长整数左移, 长整数型, 公开
  45. .参数 欲移动的整数, 长整数型
  46. .参数 欲移动的位数, 长整数型

  47. 返回 (欲移动的整数 × 求次方 (2, 欲移动的位数))


  48. .子程序 长整数右移, 长整数型, 公开
  49. .参数 欲移动的整数, 长整数型
  50. .参数 欲移动的位数, 长整数型

  51. 返回 (欲移动的整数 × 求次方 (0.5, 欲移动的位数))


  52. .子程序 二进制补64个0, 文本型
  53. .参数 二进制文本, 文本型

  54. 返回 (取重复文本 (64 - 取文本长度 (二进制文本), “0”) + 二进制文本)


  55. .子程序 长整数取最大值, 长整数型, 公开
  56. .参数 欲比较的数值A, 长整数型
  57. .参数 欲比较的数值B, 长整数型

  58. .如果真 (欲比较的数值A > 欲比较的数值B)
  59.     返回 (欲比较的数值A)
  60. .如果真结束
  61. 返回 (欲比较的数值B)


  62. .子程序 长整数取最小值, 长整数型, 公开
  63. .参数 欲比较的数值A, 长整数型
  64. .参数 欲比较的数值B, 长整数型

  65. .如果真 (欲比较的数值A < 欲比较的数值B)
  66.     返回 (欲比较的数值A)
  67. .如果真结束
  68. 返回 (欲比较的数值B)


  69. .子程序 进制转换, 文本型, , 不支持小数 负数
  70. .参数 欲转换的数字, 文本型
  71. .参数 转换前的进制, 字节型
  72. .参数 转换后的进制, 字节型
  73. .局部变量 数组, 字节型, , "0"
  74. .局部变量 计数, 整数型
  75. .局部变量 长度, 整数型
  76. .局部变量 运算值, 整数型
  77. .局部变量 返回值, 文本型

  78. 长度 = 取文本长度 (欲转换的数字)
  79. 重定义数组 (数组, 假, 长度)
  80. .计次循环首 (长度, 计数)
  81.     数组 [计数] = 数值转换A (取代码 (欲转换的数字, 计数))
  82. .计次循环尾 ()
  83. .判断循环首 (长度 ≥ 1)
  84.     运算值 = 0
  85.     .计次循环首 (长度, 计数)
  86.         运算值 = 运算值 × 转换前的进制 + 数组 [计数]
  87.         数组 [计数] = 运算值 ÷ 转换后的进制
  88.         运算值 = 运算值 % 转换后的进制
  89.     .计次循环尾 ()
  90.     返回值 = 字符 (数值转换B (运算值)) + 返回值
  91.     运算值 = 1
  92.     .判断循环首 (运算值 ≤ 长度 且 数组 [运算值] = 0)
  93.         运算值 = 运算值 + 1
  94.     .判断循环尾 ()
  95.     删除成员 (数组, 1, 运算值 - 1)
  96.     长度 = 取数组成员数 (数组)
  97. .判断循环尾 ()
  98. 返回 (返回值)

  99. .子程序 数值转换A, 字节型
  100. .参数 值, 字节型

  101. .判断开始 (值 ≤ 58)
  102.     返回 (值 - 48)
  103. .判断 (值 ≤ 90)
  104.     返回 (值 - 65 + 10)
  105. .默认
  106.     返回 (值 - 97 + 36)
  107. .判断结束


  108. .子程序 数值转换B, 字节型
  109. .参数 值, 字节型

  110. .判断开始 (值 ≤ 9)
  111.     返回 (值 + 48)
  112. .判断 (值 ≤ 35)
  113.     返回 (值 + 65 - 10)
  114. .默认
  115.     返回 (值 + 97 - 36)
  116. .判断结束



  117. .子程序 数值转换C, 文本型
  118. .参数 值, 字节型

  119. .如果真 (值 < 10)
  120.     返回 (“ ” + 到文本 (值))
  121. .如果真结束
  122. 返回 (到文本 (值))

  123. .子程序 文本二进制位异或, 文本型
  124. .参数 值A, 文本型
  125. .参数 值B, 文本型
  126. .局部变量 计数, 整数型
  127. .局部变量 返回值, 文本型

  128. .计次循环首 (取文本长度 (值A), 计数)
  129.     .如果 (取文本中间 (值A, 计数, 1) ≠ 取文本中间 (值B, 计数, 1))
  130.         返回值 = 返回值 + “1”
  131.     .否则
  132.         返回值 = 返回值 + “0”

  133.     .如果结束

  134. .计次循环尾 ()
  135. 返回 (返回值)


  136. .子程序 文本二进制位与, 文本型
  137. .参数 值A, 文本型
  138. .参数 值B, 文本型
  139. .局部变量 计数, 整数型
  140. .局部变量 返回值, 文本型

  141. .计次循环首 (取文本长度 (值A), 计数)
  142.     .如果 (取文本中间 (值A, 计数, 1) = “1” 且 取文本中间 (值B, 计数, 1) = “1”)
  143.         返回值 = 返回值 + “1”
  144.     .否则
  145.         返回值 = 返回值 + “0”

  146.     .如果结束

  147. .计次循环尾 ()
  148. 返回 (返回值)


  149. .子程序 文本二进制位或, 文本型
  150. .参数 值A, 文本型
  151. .参数 值B, 文本型
  152. .局部变量 计数, 整数型
  153. .局部变量 返回值, 文本型

  154. .计次循环首 (取文本长度 (值A), 计数)
  155.     .如果 (取文本中间 (值A, 计数, 1) = “1” 或 取文本中间 (值B, 计数, 1) = “1”)
  156.         返回值 = 返回值 + “1”
  157.     .否则
  158.         返回值 = 返回值 + “0”

  159.     .如果结束

  160. .计次循环尾 ()
  161. 返回 (返回值)


  162. .子程序 长整数位与, 长整数型, 公开, 不支持负数
  163. .参数 位运算数值一, 长整数型
  164. .参数 位运算数值二, 长整数型
  165. .局部变量 二进制位1, 文本型
  166. .局部变量 二进制位2, 文本型

  167. .如果真 (位运算数值一 < 0 或 位运算数值二 < 0)
  168.     返回 (0)
  169. .如果真结束
  170. 返回 (到长整数 (进制转换 (文本二进制位与 (二进制补64个0 (进制转换 (到文本 (位运算数值一), 10, 2)), 二进制补64个0 (进制转换 (到文本 (位运算数值二), 10, 2))), 2, 10)))


  171. .子程序 长整数位或, 长整数型, 公开, 不支持负数
  172. .参数 位运算数值一, 长整数型
  173. .参数 位运算数值二, 长整数型
  174. .局部变量 二进制位1, 文本型
  175. .局部变量 二进制位2, 文本型

  176. .如果真 (位运算数值一 < 0 或 位运算数值二 < 0)
  177.     返回 (0)
  178. .如果真结束
  179. 返回 (到长整数 (进制转换 (文本二进制位或 (二进制补64个0 (进制转换 (到文本 (位运算数值一), 10, 2)), 二进制补64个0 (进制转换 (到文本 (位运算数值二), 10, 2))), 2, 10)))


  180. .子程序 长整数位异或, 长整数型, 公开, 不支持负数
  181. .参数 位运算数值一, 长整数型
  182. .参数 位运算数值二, 长整数型
  183. .局部变量 二进制位1, 文本型
  184. .局部变量 二进制位2, 文本型

  185. .如果真 (位运算数值一 < 0 或 位运算数值二 < 0)
  186.     返回 (0)
  187. .如果真结束
  188. 返回 (到长整数 (进制转换 (文本二进制位异或 (二进制补64个0 (进制转换 (到文本 (位运算数值一), 10, 2)), 二进制补64个0 (进制转换 (到文本 (位运算数值二), 10, 2))), 2, 10)))
复制代码

发表于 2018-2-19 23:21:43 | 显示全部楼层
本帖最后由 小萌 于 2018-2-19 23:26 编辑

核心库里自带的执行这类语句纳秒级,而你这呢处理1次毫秒级慢几万倍难说。
发表于 2021-4-19 23:26:40 | 显示全部楼层

右上角搜索了解下
发表于 2018-2-20 18:39:45 | 显示全部楼层
还不如用置入代码实现,也没啥难度
发表于 2018-2-20 07:17:39 | 显示全部楼层
回复看看如何实现的
发表于 2018-2-20 17:48:29 | 显示全部楼层
我也要看看
发表于 2018-2-23 11:37:32 | 显示全部楼层
果断去另一帖子,然后看不懂
发表于 2018-2-23 22:57:58 | 显示全部楼层
我也果断到另一个帖子里去。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-19 16:09 , Processed in 0.500029 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表