【读书笔记】编程实操-位和字节(七)
目录
一. 位运算
二. 无符号整型数(简单的说 不带正负号的整型数)
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结尾的字符串
【读书笔记】编程实操-位和字节(七)相关推荐
- [读书笔记]编程之美(三)
[读书笔记]编程之美(三) 3.1字符串移位包含的问题 问题:给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含.例如,给定s1=AABCD和s2=CDAA ...
- 少儿编程 实操题搭建搅拌器 电子学会机器人等级考试一级真题解析2018-12
题目:搭建搅拌器 2018年12月机器人等级考试一级真题实操题 搭建说明 搅拌器是我们经常使用的厨房用具,特点是:通过手摇把缓慢的转动,其顶端的机械能够快速的转动,下面请考生制作一个搅拌器 搭建要求 ...
- GO delve(dlv)调试工具笔记及实操
这个文档总结了,我自己在linux通过delve上调试go代码的一些操作,比较常用的.无论是在调试应用,还是自己trace源码都挺好用. GO version: 1.16.8 dlv versoin: ...
- 读书笔记(九)--三分做事,七分做人
读书笔记--第9篇--<三分做事,七分做人> 1.享受孤独,享受痛苦. 2.有时是狮子,有时是狐狸. 3.真朋友:志同道合.雪中送炭.感言过失... 4.大树底下好 ...
- 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) ...
- 《编程珠玑,字字珠玑》45678读书笔记——编程技巧
写在最前面的 就像上一篇文章说的,"编程永远是后话"!在有了可靠的问题分析过程和数据结构的选择,能正确运行的"二分搜索"代码出现之前,把其主要的思路先在草稿上实 ...
- 《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约 命名风格 常量定义 代码格式 OPP规约 日期时间 集合处理 并发处理 控制语句 注释规约 前后分离 其它注意 命名风格 类名使用UpperCamelCase风格,但下列情形除外: ...
- python基础语法16-网络编程实操
网络编程是指在程序中实现两台计算机之间的通信. Python提供了大量的内置模块和第三方模块用于支持各种网络访问,而且Python语言在网络通信方面的优点特别突出,远远领先其他语言. 1.socket ...
- android高级编程实操期末机试试题,《网络高级编程》201001机考试题A
C#高级编程期末试题 2010<网络高级编程>试题(A卷) (时间:100分钟满分:100) 1.创建C#项目 创建一个名为:exam09班级名册序号姓名拼音VS版本(如,1班,名册序号为 ...
最新文章
- 面向对象程序设计上机练习一(函数重载)
- [Java] Web开发环境搭建 - MyEclipse 篇
- 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法...
- github.com/oschwald/maxminddb-golang 安装报错
- [題解]luogu_P2055假期的宿舍(二分圖最大匹配)
- mysql内部代码的优缺点
- linux配置命令route,linux路由配置命令route学习
- 7000个源码批量下载---复制来的
- meethigher-文库下载实现自动化
- html制作苹果手机屏幕,iphone怎么录屏幕点击动作(苹果手机的屏幕录制步骤)...
- 关于google拼音输入法的坑爹问题-IE浏览器浏览网页蓝屏等问题
- 最新XlEP分销系统网站源码
- 图解通信原理与案例分析-13:无线对讲机案例--频率调制实现语音点对点无线通信
- 条码标签制作软件导入数据库(TXT)批量打印条码
- 《机械设计基础》题库
- 手绘几何图形识别(下)
- Gmail(Google App企业邮箱)的MX设置
- 三创赛优秀作品_三创赛优秀作品.doc
- Silvaco TCAD——二维工艺仿真
- matlab相机标定工具箱下载,matlab相机标定工具箱
热门文章
- AVPlayer 本地、网络视频播放相关
- 下载神器IDM安装与使用(保姆级教程)
- 数据字典模板_C++ 模板元编程:一种屠龙之技
- can only accept this command while in the powered on state(iOS蓝牙 打开app后的第一次扫描要扫描两次)
- 2022年山西省11地市高新技术企业申报奖励补助政策及认定条件流程
- vue项目中使用swiper 实现无缝滚动
- 数据结构上机——希尔排序(含监视哨版本)
- Java基础教程--安卓入门教程(七)
- 二进制空间权重矩阵_白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵...
- 一个 Node 进程的死亡与善后