位运算

简介: 位运算

Lua 语言从 5.3 版本开始提供了针对数值类型的一组标准位运算符。与算术运算符不同的是,位运算符只能用于整型数。位运算符包括:

  • 按位与&
  • 按位或|
  • 按位异或~
  • 逻辑右移>>
  • 逻辑左移<<
  • 按位取反~


提示

按位取反~ )为一元运算符;在其他语言中,异或运算符为 ^ ,而在 Lua 语言中 ^ 表示幂运算


> string.format("%x", 0xff & 0xabcd)      --> cd
> string.format("%x", 0xff | 0xadcd)      --> abff
> string.format("%x", 0xaaaa ~ -1)        --> ffffffffffff5555
> string.format("%x", ~0)                 --> ffffffffffffffff


所有的位运算都针对构成一个整型数的所有位。在标准 Lua 中,也就是 64 位。这对于使用 32 位整型数的算法可能会称为问题(例如, SHA-2 密码散列算法)。不过,要操作 32 位整数也不难。除了右移操作外,只要忽略高 32 位,那么所有针对 64 位整型数的操作与针对 32 位整型数的操作都一样。这对于加法、减法和乘法都有效。因此,在操作 32 位整型数时,只需要在进行右移前抹去高 32 位即可(对于这类计算很少会做除法)。


两个移位操作都会用 0 填充空出的位,这种行为通常被称为逻辑移位Lua 语言没有提供算术右移,即使用符号位填充空出的位。我们可以通过向下取整除法floor 除法),除以合适的 2 的整数次幂来实现算术右移。


Note

x // 16 与算术右移 4 位等价。


移位数是负数表示向相反的方向移位,即 x>>na<<-n 等价:

> string.format("%x", 0xff << 12)         --> ff000
> string.format("%x", 0xff >> -12)        --> ff000


如果移位数等于或大于整型表示的位数(标准 Lua64 位,精简 Lua32 位),由于所有的位数都被从结果中移出了,所以结果是 0

> string.format("%x", -1 << 80)           --> 0
目录
相关文章
|
7月前
玩转位运算
玩转位运算
|
存储 Java
一篇搞定位运算(&、|、^、~、>>、<<、>>>)
我们最了解的就是十进制 , 除了十进制 , 还有二进制 , 六进制 , 八进制等等 , 由于位运算操作就是二进制 , 所以我们主要来说一下二进制 , 十进制的个位有(0~9)这几个数字 , 而二进制也相同 , 二进制的个位上只有0和1
60 0
|
2月前
|
机器学习/深度学习
位运算详解
本文介绍了位运算符及其基本操作,并通过几个例题详细解析了位运算的应用。内容包括左移`&lt;&lt;`、右移`&gt;&gt;`、按位取反`~`、与运算`&`、或运算`|`和异或运算`^`等运算符的使用方法。基本操作部分展示了如何检查和修改二进制位,以及异或运算的性质。例题部分则通过判定字符是否唯一、丢失的数字、两整数之和和消失的两个数字等问题,具体说明了位运算的实际应用技巧。
49 7
位运算详解
|
6月前
|
编译器 Linux C++
详细解读C++中的位运算总结
详细解读C++中的位运算总结
35 0
|
存储 Java 程序员
“高端”的位运算
大家好,我是王有志。原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。
93 1
|
算法 Java 编译器
第 13 天_位运算
第 13 天_位运算
90 0
位运算专题(个人理解)
位运算专题(个人理解)
73 0
|
算法 数据安全/隐私保护
基本的位运算
基本的位运算
|
算法
位运算能做什么
位运算能做什么
54 0
|
存储
位运算及A+B
位运算及A+B