delphi 关于 "高位" 与 "低位"
Longint = Integer
WPARAM = Integer
LPARAM = Integer
LRESULT = Integer
FARPROC = Pointer
function MakeWord(a, b: Byte): Word;
function MakeLong(a, b: Word): Longint;
function MakeWParam(l, h: Word): WPARAM;
function MakeLParam(l, h: Word): LPARAM;
function MakeLResult(l, h: Word): LRESULT;
function PointToLParam(P: TPoint): LPARAM;
{ Allocate an object instance }
function MakeObjectInstance(Method: TWndMethod): Pointer;
TWndMethod = procedure(var Message: TMessage) of object;
function MakeProcInstance(Proc: FARPROC; Instance: THandle): FARPROC;
SysUtils.TLanguages 取语言数据 Lo
Hi
LoWord
HiWord Int64Rec = packed record
case Integer of
: (Lo, Hi: Cardinal);
: (Cardinals: array [..] of Cardinal);
: (Words: array [..] of Word);
: (Bytes: array [..] of Byte);
end;
①
var
n1,n2: Cardinal;
num64: Int64;
rec: Int64Rec;
begin
n1 := $;
n2 := $AABBCCDD;
rec.Lo := n1;
rec.Hi := n2;
num64 := Int64(rec);
ShowMessage(IntToHex(num64, )); //AABBCCDD44332211
end;
②
var
n1,n2: Cardinal;
num64: Int64;
begin
num64 := $AABBCCDD44332211;
n1 := Int64Rec(num64).Lo; //或 n1 := Cardinal(num64);
n2 := Int64Rec(num64).Hi;
ShowMessageFmt('n1:%x; n2:%x', [n1,n2]);//n1:; n2:AABBCCDD
end; 譬如有一个 Cardinal 类型的整数:
其十六进制的表示是: $
其二进制表示是:
我们说 Cardinal 是 位的整数, 这里的位是指 "二进制的位数", 不信你数数.
我们需要重点面对的是十六进制, 不管是几进制的数在编译成汇编代码时都是用十六进制表示, 因为它最直观;
我们用十六进制来分析, 也是因为它的直观.
怎么直观的? Cardinal 有 位, 每 位一个字节, 共 个字节;
上面的例数分成字节就是: $、$、$、$, 这明显比二进制简洁、比十进制直观.
其中的 $ 是最低位的字节、$ 是最高位的字节(每字节对应十六进制的两位).
有时我们需要获取其中某个字节或某两个字节, 这虽然用位运算也不难, 但还是有了诸多函数:
--------------------------------------------------------------------------------
Lo //获取例数中的 $
Hi //获取例数中的 $
LoWord //获取例数中的 $
HiWord //获取例数中的 $
--------------------------------------------------------------------------------
其中的 Hi 好像有点费解, 为什么获取的不是 $ 而是 $ 呢?
这样理解吧: Hi 获取的是 Lo(获取)的上一个字节.
HiByte 和 Hi 基本一样, 如果参数是 位的 Word 类型, 用 HiByte 会更好些(中间会省去一个转换过程).
其中的 HiWord 是个函数, 但 LoWord 并不是个函数, 它是 Word 类型的重命名.
也就是说 LoWord(num) 等价于 Wrod(num), 这不是类型转换吗?
是的, 所以像 Lo(num) 也可以用 Byte(num) 来代替.
--------------------------------------------------------------------------------
用代码总结一下:
--------------------------------------------------------------------------------
var
num: Cardinal;
b1,b2,b3,b4: Byte;
w1,w2: Word;
begin
num := $;
w1 := Word(num);
w2 := HiWord(num);
ShowMessageFmt('w1:%x; w2:%x', [w1,w2]);//w1:; w2:
b1 := Lo(num);
b2 := Hi(num);
b3 := Byte(w2);
b4 := HiByte(w2);
ShowMessageFmt('b1:%x; b2:%x; b3:%x; b4:%x', [b1,b2,b3,b4]);//b1:; b2:; b3:; b4:
end; 补充 Windows
function HResultCode(hr: HRESULT): Integer;
begin
Result := hr and $0000FFFF;
end;
function HResultFacility(hr: HRESULT): Integer;
begin
Result := (hr shr ) and $00001FFF;
end;
function HResultSeverity(hr: HRESULT): Integer;
begin
Result := (hr shr ) and $;
end;
function MakeResult(sev, fac, code: Integer): HResult;
begin
Result := (sev shl ) or (fac shl ) or code;
end;
function GetCValue(cmyk: COLORREF): Byte; inline;
function GetMValue(cmyk: COLORREF): Byte; inline;
function GetYValue(cmyk: COLORREF): Byte; inline;
function GetKValue(cmyk: COLORREF): Byte; inline;
function CMYK(c, m, y, k: Byte): COLORREF;
function RGB(r, g, b: Byte): COLORREF; inline;
function PaletteRGB(r, g, b: Byte): COLORREF; inline;
function PaletteIndex(i: Word): COLORREF; inline;
function GetRValue(rgb: DWORD): Byte; inline;
function GetGValue(rgb: DWORD): Byte; inline;
function GetBValue(rgb: DWORD): Byte; inline;
都是同一种逻辑。
delphi 关于 "高位" 与 "低位"的更多相关文章
- 整数v,从高位到低位,取c位数,得到最大数 (其中:v>=10^c)
题目如上,例子v=22312324,c=3,求得最大数为334. 用自己的想法实现了一遍,如果你有更好的方法的话,欢迎不吝赐教. 我的思路是,先将整数v按位存入一个数组,数组低位为整数高位,如num[ ...
- 预处理、const、static与sizeof-用宏定义得到一个字的高位和低位字节
1:代码如下: #define WORD_LO(XXX) ((byte) (word)(XXX) & 255) #define WORD_HI(XXX) ((byte) (word)(XXX) ...
- Delphi 使用之函数
函数由一句或多句代码组成,可以实现某个特定的功能.使用函数可以使代码更加易读.易懂,加快编程速度及减少重复代码.过程与函数类似,过程与函数最重要的区别在于,过程没有返回值,而函数能有返回值. ...
- Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)
Delphi动态事件深入分析 2009-2-7 作者:不得闲核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递... 首先做一个空窗 ...
- Delphi里的RTTI与反射(举例换掉FOnChange)
Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...
- 如何使用Delphi编写Modbus RTU CRC16的校验码
在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16. 而对CRC1 ...
- Delphi动态事件深入分析
[delphi] view plain copy print? 首先做一个窗体如下 然后单元中如下代码: 在implementation下面声明两个方法如下: //外部方法,只声明一个参数,此时按 ...
- .net下简单快捷的数值高低位切换
.net下简单快捷的数值高低位切换 做网络通讯中数值传输是很普遍的事情,但数值的存储在不平台和硬件上存储方式都不一样,主要有两大类分别是高位和低位存储:而.net平台下是低位存储,通过.net提供的函 ...
- HashMap之扰动函数和低位掩码
我们都知道,hashMap在实现的时候,为了寻找在数组上的位置,主要做了两件事 int hash = hash(key); int i = indexFor(key, table.length); 这 ...
随机推荐
- vue--http请求的封装--session
export function Fecth (url, data, file, _method) { if (file) { // 需要上传文件 return new Promise((resolve ...
- 微软Power BI 每月功能更新系列——3月Power BI 新功能学习
本月对Power BI Desktop 来讲是非常令人兴奋的一个月!!!以下是3月份最新的功能,下面马上带领大家看看本月的更新内容. 报表功能 报告页面工具提示(预览) 通过报告页面工具提示功能,可 ...
- maven导出项目依赖的jar包
摘要: 在进行项目部署时,需要将maven项目所依赖的jar导出到指定目录,本文讲解如何导出项目依赖的jar包 一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的 ...
- MySQL将DESC等关键字作为列名表名的处理方式
面试被问到一个问题,假如MySQL中的关键字在查询语句中作为列明或者表名出现,应该怎么处理. 例如 select desc from t; 首先创建一张表,包含两个字段,id和desc 插入了三条数据 ...
- C++ STL 数据结构与算法 —— 排序
1. Top k 大的数 排序后直接索引输出:O(nlogn)" role="presentation">O(nlogn)O(nlogn) std::sort( ...
- Linux OTG当串口、网口、U盘
/********************************************************************************* * Linux OTG当串口.网口 ...
- 【摄像头】Global Shutter(全局快门)与Rolling Shutter(卷帘快门)的区别与比较
由于红外补光灯的爆闪,所以一般DMS会用global shutter的sensor,而不是rolling shutter的. 参考 1. Global Shutter(全局快门)与Rolling Sh ...
- 变量与算术表达式 - C程序设计语言
#include <stdio.h> int main() { float fahr,celsius; float lower,upper,step; lower = 0; upper = ...
- Install Java on Ubuntu server
准备工作 a) 获得超级用户权限 关于超级用户访问权限的说明: 要将 Java 安装在系统级位置(例如 /usr/java),则必须以超级用户身份登录,从而获得必要的权限.如果您不具有超级用户访问权限 ...
- Go Example--数组
package main import "fmt" func main() { //定义一个数组并完成初始化,初始值为对应的零值 var a [5]int fmt.Println( ...