关于Lua实现位运算 模块分析

移动开发 iOS
Lua实现位运算 模块分析是本文要介绍的内容,主要是来学习LUA中的位运算,本文通过代码来实现位运算的操作,具体内容来看本文详解。

Lua实现位运算 模块分析是本文要介绍的内容,主要是来学习LUA中的位运算,本文通过代码来实现位运算的操作,具体内容来看本文详解。

  1. --[[  
  2. Description:  
  3.     FileName:bit.lua  
  4.     This module provides a selection of bitwise operations.  
  5. History:  
  6.     Initial version created by  阵雨 2005-11-10.  
  7. Notes:  
  8.   ....  
  9. ]]  
  10. --[[{2147483648,1073741824,536870912,268435456,134217728,67108864,33554432,16777216,  
  11.         8388608,4194304,2097152,1048576,524288,262144,131072,65536,  
  12.         32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1}  
  13.         ]]  
  14.  
  15.  
  16. bit={data32={}}  
  17. for i=1,32 do  
  18.     bit.data32[i]=2^(32-i)  
  19. end  
  20.  
  21. function bit:d2b(arg)  
  22.     local   tr={}  
  23.     for i=1,32 do  
  24.         if arg >= self.data32[i] then  
  25.         tr[i]=1  
  26.         argarg=arg-self.data32[i]  
  27.         else  
  28.         tr[i]=0  
  29.         end  
  30.     end  
  31.     return   tr  
  32. end   --bit:d2b  
  33.  
  34. function    bit:b2d(arg)  
  35.     local   nr=0 
  36.     for i=1,32 do  
  37.         if arg[i] ==1 then  
  38.         nrnr=nr+2^(32-i)  
  39.         end  
  40.     end  
  41.     return  nr  
  42. end   --bit:b2d  
  43.  
  44. function    bit:_xor(a,b)  
  45.     local   op1=self:d2b(a)  
  46.     local   op2=self:d2b(b)  
  47.     local   r={}  
  48.  
  49.     for i=1,32 do  
  50.         if op1[i]==op2[i] then  
  51.             r[i]=0  
  52.         else  
  53.             r[i]=1  
  54.         end  
  55.     end  
  56.     return  self:b2d(r)  
  57. end --bit:xor  
  58.  
  59. function    bit:_and(a,b)  
  60.     local   op1=self:d2b(a)  
  61.     local   op2=self:d2b(b)  
  62.     local   r={}  
  63.       
  64.     for i=1,32 do  
  65.         if op1[i]==1 and op2[i]==1  then  
  66.             r[i]=1  
  67.         else  
  68.             r[i]=0  
  69.         end  
  70.     end  
  71.     return  self:b2d(r)  
  72.       
  73. end --bit:_and  
  74.  
  75. function    bit:_or(a,b)  
  76.     local   op1=self:d2b(a)  
  77.     local   op2=self:d2b(b)  
  78.     local   r={}  
  79.       
  80.     for i=1,32 do  
  81.         if  op1[i]==1 or   op2[i]==1   then  
  82.             r[i]=1  
  83.         else  
  84.             r[i]=0  
  85.         end  
  86.     end  
  87.     return  self:b2d(r)  
  88. end --bit:_or  
  89.  
  90. function    bit:_not(a)  
  91.     local   op1=self:d2b(a)  
  92.     local   r={}  
  93.  
  94.     for i=1,32 do  
  95.         if  op1[i]==1   then  
  96.             r[i]=0  
  97.         else  
  98.             r[i]=1  
  99.         end  
  100.     end  
  101.     return  self:b2d(r)  
  102. end --bit:_not  
  103.  
  104. function    bit:_rshift(a,n)  
  105.     local   op1=self:d2b(a)  
  106.     local   r=self:d2b(0)  
  107.       
  108.     if n < 32 and n > 0 then  
  109.         for i=1,n do  
  110.             for i=31,1,-1 do  
  111.                 op1[i+1]=op1[i]  
  112.             end  
  113.             op1[1]=0  
  114.         end  
  115.     r=op1 
  116.     end  
  117.     return  self:b2d(r)  
  118. end --bit:_rshift  
  119.  
  120. function    bit:_lshift(a,n)  
  121.     local   op1=self:d2b(a)  
  122.     local   r=self:d2b(0)  
  123.       
  124.     if n < 32 and n > 0 then  
  125.         for i=1,n   do  
  126.             for i=1,31 do  
  127.                 op1[i]=op1[i+1]  
  128.             end  
  129.             op1[32]=0  
  130.         end  
  131.     r=op1 
  132.     end  
  133.     return  self:b2d(r)  
  134. end --bit:_lshift  
  135.  
  136.  
  137. function    bit:print(ta)  
  138.     local   sr="" 
  139.     for i=1,32 do  
  140.         srsr=sr..ta[i]  
  141.     end  
  142.     print(sr)  
  143. end  
  144.  
  145. bs=bit:d2b(7)  
  146. bit:print(bs)                            
  147. -->00000000000000000000000000000111  
  148. bit:print(bit:d2b(bit:_not(7)))           
  149. -->11111111111111111111111111111000  
  150. bit:print(bit:d2b(bit:_rshift(7,2)))      
  151. -->00000000000000000000000000000001  
  152. bit:print(bit:d2b(bit:_lshift(7,2)))      
  153. -->00000000000000000000000000011100  
  154. print(bit:b2d(bs))                      -->     7  
  155. print(bit:_xor(7,2))                    -->     5  
  156. print(bit:_and(7,4))                    -->     4  
  157. print(bit:_or(5,2))                     -->     7  
  158.  
  159. --end of bit.lua   
  160.  
  161. 小结:关于Lua实现位运算 模块分析的内容介绍完了,希望通过本文的学习能对你有所帮助!关于Lua实现位运算 模块分析  
  162.  
  163. Lua实现位运算 模块分析是本文要介绍的内容,主要是来学习LUA中的位运算,本文通过代码来实现位运算的操作,具体内容来看本文详解。  
  164.  
  165. --[[  
  166. Description:  
  167.     FileName:bit.lua  
  168.     This module provides a selection of bitwise operations.  
  169. History:  
  170.     Initial version created by  阵雨 2005-11-10.  
  171. Notes:  
  172.   ....  
  173. ]]  
  174. --[[{2147483648,1073741824,536870912,268435456,134217728,67108864,33554432,16777216,  
  175.         8388608,4194304,2097152,1048576,524288,262144,131072,65536,  
  176.         32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1}  
  177.         ]]  
  178.  
  179.  
  180. bit={data32={}}  
  181. for i=1,32 do  
  182.     bit.data32[i]=2^(32-i)  
  183. end  
  184.  
  185. function bit:d2b(arg)  
  186.     local   tr={}  
  187.     for i=1,32 do  
  188.         if arg >= self.data32[i] then  
  189.         tr[i]=1  
  190.         argarg=arg-self.data32[i]  
  191.         else  
  192.         tr[i]=0  
  193.         end  
  194.     end  
  195.     return   tr  
  196. end   --bit:d2b  
  197.  
  198. function    bit:b2d(arg)  
  199.     local   nr=0 
  200.     for i=1,32 do  
  201.         if arg[i] ==1 then  
  202.         nrnr=nr+2^(32-i)  
  203.         end  
  204.     end  
  205.     return  nr  
  206. end   --bit:b2d  
  207.  
  208. function    bit:_xor(a,b)  
  209.     local   op1=self:d2b(a)  
  210.     local   op2=self:d2b(b)  
  211.     local   r={}  
  212.  
  213.     for i=1,32 do  
  214.         if op1[i]==op2[i] then  
  215.             r[i]=0  
  216.         else  
  217.             r[i]=1  
  218.         end  
  219.     end  
  220.     return  self:b2d(r)  
  221. end --bit:xor  
  222.  
  223. function    bit:_and(a,b)  
  224.     local   op1=self:d2b(a)  
  225.     local   op2=self:d2b(b)  
  226.     local   r={}  
  227.       
  228.     for i=1,32 do  
  229.         if op1[i]==1 and op2[i]==1  then  
  230.             r[i]=1  
  231.         else  
  232.             r[i]=0  
  233.         end  
  234.     end  
  235.     return  self:b2d(r)  
  236.       
  237. end --bit:_and  
  238.  
  239. function    bit:_or(a,b)  
  240.     local   op1=self:d2b(a)  
  241.     local   op2=self:d2b(b)  
  242.     local   r={}  
  243.       
  244.     for i=1,32 do  
  245.         if  op1[i]==1 or   op2[i]==1   then  
  246.             r[i]=1  
  247.         else  
  248.             r[i]=0  
  249.         end  
  250.     end  
  251.     return  self:b2d(r)  
  252. end --bit:_or  
  253.  
  254. function    bit:_not(a)  
  255.     local   op1=self:d2b(a)  
  256.     local   r={}  
  257.  
  258.     for i=1,32 do  
  259.         if  op1[i]==1   then  
  260.             r[i]=0  
  261.         else  
  262.             r[i]=1  
  263.         end  
  264.     end  
  265.     return  self:b2d(r)  
  266. end --bit:_not  
  267.  
  268. function    bit:_rshift(a,n)  
  269.     local   op1=self:d2b(a)  
  270.     local   r=self:d2b(0)  
  271.       
  272.     if n < 32 and n > 0 then  
  273.         for i=1,n do  
  274.             for i=31,1,-1 do  
  275.                 op1[i+1]=op1[i]  
  276.             end  
  277.             op1[1]=0  
  278.         end  
  279.     r=op1 
  280.     end  
  281.     return  self:b2d(r)  
  282. end --bit:_rshift  
  283.  
  284. function    bit:_lshift(a,n)  
  285.     local   op1=self:d2b(a)  
  286.     local   r=self:d2b(0)  
  287.       
  288.     if n < 32 and n > 0 then  
  289.         for i=1,n   do  
  290.             for i=1,31 do  
  291.                 op1[i]=op1[i+1]  
  292.             end  
  293.             op1[32]=0  
  294.         end  
  295.     r=op1 
  296.     end  
  297.     return  self:b2d(r)  
  298. end --bit:_lshift  
  299.  
  300.  
  301. function    bit:print(ta)  
  302.     local   sr="" 
  303.     for i=1,32 do  
  304.         srsr=sr..ta[i]  
  305.     end  
  306.     print(sr)  
  307. end  
  308.  
  309. bs=bit:d2b(7)  
  310. bit:print(bs)                            
  311. -->00000000000000000000000000000111  
  312. bit:print(bit:d2b(bit:_not(7)))           
  313. -->11111111111111111111111111111000  
  314. bit:print(bit:d2b(bit:_rshift(7,2)))      
  315. -->00000000000000000000000000000001  
  316. bit:print(bit:d2b(bit:_lshift(7,2)))      
  317. -->00000000000000000000000000011100  
  318. print(bit:b2d(bs))                      -->     7  
  319. print(bit:_xor(7,2))                    -->     5  
  320. print(bit:_and(7,4))                    -->     4  
  321. print(bit:_or(5,2))                     -->     7 

0--end of bit.lua

小结:关于Lua实现位运算 模块分析的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: CSDN博客
相关推荐

2011-08-24 16:59:59

LuaModule

2011-08-25 15:41:42

Lua源码

2011-08-24 15:42:38

LUA源代码

2011-08-24 16:24:54

Lua源代码

2011-08-31 16:47:07

Lua调试器

2011-08-23 14:33:51

Lua捕获字符串

2011-08-30 09:59:47

Mysql ProxyLUA

2011-08-31 16:39:06

Lua调试器

2011-08-24 17:19:20

Lua源文件

2011-08-25 10:07:24

Lua 5.0函数编译器

2011-08-31 16:06:50

LuaWeb开发

2022-05-18 16:06:15

位运算异或运算

2009-06-18 13:06:59

C#位运算权限管理

2011-08-29 16:48:50

Lua配置文件C++

2013-12-03 17:28:56

Lua脚本语言

2011-08-25 15:51:10

Lua脚本

2011-08-29 16:37:21

Lua协同线程

2011-08-23 15:34:56

Lua模式 匹配

2011-08-24 14:33:14

LUA开发环境Decoda

2011-09-06 17:37:01

LUA应用
点赞
收藏

51CTO技术栈公众号