目录

一. 位运算

二. 无符号整型数(简单的说 不带正负号的整型数)

2.1 整型类型的定义

2.2 Lua中的无符号整型

2.2.3 如何处理无符号整型数,请看下面例子

三. 打包和解包二进制数据

例1. 输出一个指定字符串中所有被打包的字符串


一. 位运算

与算术运算符不同,位运算符只能用于整型数。位运算符包括 &(按位与)、|(按位或)、~(按位异或)、>>(逻辑右移)、(逻辑左移) 和 一元运算符~(按位取反) 。(注意:在其他一些语言中,异或运算符位^, 而在Lua语言中^ 代表幂运算)

二进制按位与、按位或、按位异或的理解

-- 下面例子都是用16进制表现
string.format("%x", 0xff & 0xabcd)    --> cd
string.format("%x", 0xff | 0xabcd)    --> abff
string.format("%x", 0xaaaa ~ -1)  --> ffffffffffff5555
string.format("%x", ~0)       --> ffffffffffffffff

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

移位数是负数表示向相反的方向移位,即a>>n 与 a:

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

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

string.format("%x", -1 << 80) --> 0

二. 无符号整型数(简单的说 不带正负号的整型数)

无符合整型数(百度百科)

2.1 整型类型的定义

整型有无符号(unsigned)有符号(signed)两种类型。在默认情况下声明的整型变量都是有符号的类型。

无符号整型和有符号整型的区别:无符号类型可以存放的正数范围比有符号整型中范围大一倍,因为有符号类型将最高位用来存储符号,而无符号类型全部存储数字

2.2 Lua中的无符号整型

2.2.3 如何处理无符号整型数,请看下面例子

> x = 13835058055282163712   --这是一个比2^63-1 还大的数,所以X是一个无符号整型数
> x --> - 4611686018427387904
-- 在控制台输出为 一个负数,因为Lua整型默认是有符号整型, 正数部分最大是 2^63-1 ,
--  所以X 比 2^63-1 还大 4611686018427387904 这么多,所以自动转换成负数

那么如果需要对有符号整数进行处理的话,需要怎么做呢?

a. 可以使用选项 %u 或 %x 在函数string.format 中指定以无符号整型数进行输出

string.format("%u", x) --> 13835058055282163712
sting.format("0x%X", x)   --> 0xC000000000000000 (十六进制)

                b. 加法、减法和乘法操作对于有符号整型数和无符号整型数是一样的

string.format("%u", x) --> 13835058055282163712
string.format("%u", x + 1)   --> 13835058055282163713
string.format("%u", x - 1)    --> 13835058055282163711

   c. 比较运算符 比较 不同符号位的整型数会出现问题,因为有符号整型的整数更小,代表的是负数,

0x7fffffffffffffff < 0x8000000000000000 --> false 

Lua5.3提供了函数math.ult 来比较无符号整型数

math.ult(0x7fffffffffffffff, 0x8000000000000000) --> true

或者 在进行有符号比较前先用掩码掩去两个操作数的符号位

mask = 0x8000000000000000
(0x77fffffffffffffff ~ mask) < (0x8000000000000000 ~ mask) --> true

  d. 无符号除法(算法直接用)

function udiv(n, d)if d < 0 thenif math.ult(n, d) then return 0elsereturn 1endlocal q = ((n >> 1) // d) << 1local r = n - q * dif not math.utl(r, d) then q = q + 1 endreturn q   end
end

e. 无符号整型数转换为浮点型数(算法直接用)

                要把一个无符号整型数转换位浮点型数,可以先将其转换成有符号整型数,取模纠正结果

u = 11529215046068469760
f = (u + 0.0) % 2^64
string.format("%.0f"", f)    --> 11529215046068469760

   f. 浮点型数转换为无符号整型数(算法直接用)

f = 0xA000000000000000.0
u = math.tointeger(((f + 2 ^63) % 2^64) - 2^63)
string.format("%x", u)    --> a000000000000000

三. 打包和解包二进制数据

  函数 string.pack: 会把值 "打包"为二进制字符串

        函数 string.unpack: 则从字符串中提取这些值

string.pack 和 string.unpack 的第一个参数是格式化字符串,用于描述如何打包数据。格式化字符串中的每个字母都描述了如何打包/解包一个值

s = string.pack("iii", 3, -27, 450)
> #s --> 12
> string.unpack("iii",s)   -->3 -27 450 13(即 unpack函数会返回最后一个读取的元素在字符串的位置)

string.unpack 有一个可选的第三参数,用于指定开始读取的位置

例1. 输出一个指定字符串中所有被打包的字符串

s = "hello\0Lua\0world\0"
local i = 1
while i <= #s dolocal resres, i = string.unpack("z", s, i)print(res)
end
--> hello
--> Lua
--> world

选项 z意味着一个以\0结尾的字符串

【读书笔记】编程实操-位和字节(七)相关推荐

  1. [读书笔记]编程之美(三)

    [读书笔记]编程之美(三) 3.1字符串移位包含的问题 问题:给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含.例如,给定s1=AABCD和s2=CDAA ...

  2. 少儿编程 实操题搭建搅拌器 电子学会机器人等级考试一级真题解析2018-12

    题目:搭建搅拌器 2018年12月机器人等级考试一级真题实操题 搭建说明 搅拌器是我们经常使用的厨房用具,特点是:通过手摇把缓慢的转动,其顶端的机械能够快速的转动,下面请考生制作一个搅拌器 搭建要求 ...

  3. GO delve(dlv)调试工具笔记及实操

    这个文档总结了,我自己在linux通过delve上调试go代码的一些操作,比较常用的.无论是在调试应用,还是自己trace源码都挺好用. GO version: 1.16.8 dlv versoin: ...

  4. 读书笔记(九)--三分做事,七分做人

    读书笔记--第9篇--<三分做事,七分做人>    1.享受孤独,享受痛苦.    2.有时是狮子,有时是狐狸.    3.真朋友:志同道合.雪中送炭.感言过失...    4.大树底下好 ...

  5. python3 gui tk代码_【基础】学习笔记30-python3 tkinter GUI编程-实操12

    import tkinter as tk win = tk.Tk() menu = tk.Menu(win)  # 创建顶层菜单 filemenu = tk.Menu(menu, tearoff=0) ...

  6. 《编程珠玑,字字珠玑》45678读书笔记——编程技巧

    写在最前面的 就像上一篇文章说的,"编程永远是后话"!在有了可靠的问题分析过程和数据结构的选择,能正确运行的"二分搜索"代码出现之前,把其主要的思路先在草稿上实 ...

  7. 《阿里巴巴开发手册》读书笔记-编程规约

    Java编程规约 命名风格 常量定义 代码格式 OPP规约 日期时间 集合处理 并发处理 控制语句 注释规约 前后分离 其它注意 命名风格 类名使用UpperCamelCase风格,但下列情形除外: ...

  8. python基础语法16-网络编程实操

    网络编程是指在程序中实现两台计算机之间的通信. Python提供了大量的内置模块和第三方模块用于支持各种网络访问,而且Python语言在网络通信方面的优点特别突出,远远领先其他语言. 1.socket ...

  9. android高级编程实操期末机试试题,《网络高级编程》201001机考试题A

    C#高级编程期末试题 2010<网络高级编程>试题(A卷) (时间:100分钟满分:100) 1.创建C#项目 创建一个名为:exam09班级名册序号姓名拼音VS版本(如,1班,名册序号为 ...

最新文章

  1. 面向对象程序设计上机练习一(函数重载)
  2. [Java] Web开发环境搭建 - MyEclipse 篇
  3. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法...
  4. github.com/oschwald/maxminddb-golang 安装报错
  5. [題解]luogu_P2055假期的宿舍(二分圖最大匹配)
  6. mysql内部代码的优缺点
  7. linux配置命令route,linux路由配置命令route学习
  8. 7000个源码批量下载---复制来的
  9. meethigher-文库下载实现自动化
  10. html制作苹果手机屏幕,iphone怎么录屏幕点击动作(苹果手机的屏幕录制步骤)...
  11. 关于google拼音输入法的坑爹问题-IE浏览器浏览网页蓝屏等问题
  12. 最新XlEP分销系统网站源码
  13. 图解通信原理与案例分析-13:无线对讲机案例--频率调制实现语音点对点无线通信
  14. 条码标签制作软件导入数据库(TXT)批量打印条码
  15. 《机械设计基础》题库
  16. 手绘几何图形识别(下)
  17. Gmail(Google App企业邮箱)的MX设置
  18. 三创赛优秀作品_三创赛优秀作品.doc
  19. Silvaco TCAD——二维工艺仿真
  20. matlab相机标定工具箱下载,matlab相机标定工具箱

热门文章

  1. AVPlayer 本地、网络视频播放相关
  2. 下载神器IDM安装与使用(保姆级教程)
  3. 数据字典模板_C++ 模板元编程:一种屠龙之技
  4. can only accept this command while in the powered on state(iOS蓝牙 打开app后的第一次扫描要扫描两次)
  5. 2022年山西省11地市高新技术企业申报奖励补助政策及认定条件流程
  6. vue项目中使用swiper 实现无缝滚动
  7. 数据结构上机——希尔排序(含监视哨版本)
  8. Java基础教程--安卓入门教程(七)
  9. 二进制空间权重矩阵_白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵...
  10. 一个 Node 进程的死亡与善后