Lua程序设计(19)

位运算

Lua语言从5.3版本开始提供了对数值类型的一组标准位运算符(bitwise operator),这类运算符仅能作用于整形数。位运算符包括按位与,按位或,按位异或,逻辑右移,逻辑左移和一元运算符按位取反。

所有的位运算都针对构成一个整形数的所有位,在标准Lua中也就是64位。

特别要注意的Lua语言与C语言不同的是,Lua语言的两个以为操作都会用0天聪空出的为,也就是逻辑移位,Lua语言没有提供算术右移的方法。

无符号整形数

整形表示中使用一个比特来存储符号位,因此,64位整形数最大可以表示2^63-1而不是2^64-1。Lua语言不显示支持无符号整形数。

Lua原因输出常量的方式在默认情况下,打印数值时将其作为有符号整形数处理。可以使用选项%u或%x在函数string.format中指定以无符号整形数输出。

关系运算对于有符号整形数和无符号整形数是不一样的,对于有符号整形数而言,符号位被置位的整数更小,因为它代表的是负数。

因此,我们需要使用一种不同得操作来比较无符号整型数。Lua5.3提供了math.ult来完成这个需求。

无符号除法和有符号除法也不一样

function udiv (n, d)
    if d < 0 then
        if math.ult(n,d) then return 0
        else return 1
        end
    end
    local q = ((n >> 1) // d << 1
    local r = n - q * d
    if not math.ult(r,d) then q = q + 1 end
    return q
end

第一个比较(d<0)等价于比较d是否大于2^63,如果大于那么商只能是能是1(n大于等于d)或0.否则,我们是被除数除以二即右移一位,然后除以除数,再把结果乘以二。右移一位相当于除以2的无符号除法,其结果是一个非负有符号整形数。后续的左移则纠正了商,还原了之前的除法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值