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 关于 "高位" 与 "低位"的更多相关文章

  1. 整数v,从高位到低位,取c位数,得到最大数 (其中:v>=10^c)

    题目如上,例子v=22312324,c=3,求得最大数为334. 用自己的想法实现了一遍,如果你有更好的方法的话,欢迎不吝赐教. 我的思路是,先将整数v按位存入一个数组,数组低位为整数高位,如num[ ...

  2. 预处理、const、static与sizeof-用宏定义得到一个字的高位和低位字节

    1:代码如下: #define WORD_LO(XXX) ((byte) (word)(XXX) & 255) #define WORD_HI(XXX) ((byte) (word)(XXX) ...

  3. Delphi 使用之函数

    函数由一句或多句代码组成,可以实现某个特定的功能.使用函数可以使代码更加易读.易懂,加快编程速度及减少重复代码.过程与函数类似,过程与函数最重要的区别在于,过程没有返回值,而函数能有返回值.     ...

  4. Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)

    Delphi动态事件深入分析 2009-2-7 作者:不得闲核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递... 首先做一个空窗 ...

  5. Delphi里的RTTI与反射(举例换掉FOnChange)

    Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...

  6. 如何使用Delphi编写Modbus RTU CRC16的校验码

    在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16.     而对CRC1 ...

  7. Delphi动态事件深入分析

    [delphi] view plain copy   print? 首先做一个窗体如下 然后单元中如下代码: 在implementation下面声明两个方法如下: //外部方法,只声明一个参数,此时按 ...

  8. .net下简单快捷的数值高低位切换

    .net下简单快捷的数值高低位切换 做网络通讯中数值传输是很普遍的事情,但数值的存储在不平台和硬件上存储方式都不一样,主要有两大类分别是高位和低位存储:而.net平台下是低位存储,通过.net提供的函 ...

  9. HashMap之扰动函数和低位掩码

    我们都知道,hashMap在实现的时候,为了寻找在数组上的位置,主要做了两件事 int hash = hash(key); int i = indexFor(key, table.length); 这 ...

随机推荐

  1. RESTful Web Service 架构

    特点:简单,可靠,高效,跨平台和跨语言 含义: Web Service 简单来说是指提供给不同设备通过互联网(一般使用 HTTP 协议)进行通信和交换数据的一种服务.RESTful Web Servi ...

  2. Java的Annotation标签

    只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service,但不是所有的Java类都可以发布成Web Service.Java类若要成为一个实现了Web S ...

  3. 大数据-07-Spark之流数据

    摘自 http://dblab.xmu.edu.cn/blog/1084-2/ 简介 DStream是Spark Streaming的编程模型,DStream的操作包括输入.转换和输出. Spark ...

  4. Oracle账户管理

    登录:conn 用户名/口令创建用户create user 用户名 identified by 口令修改密码password 用户名删除用户drop user 用户名如果要删除的用户已经创建表,那么再 ...

  5. pycharm 4注册码

    pycharm 4 注册码 (4.x版均可使用) 用户名:pycharmLicense key: ===== LICENSE BEGIN =====2581-D36230T00000QoX2zbDCV ...

  6. 创建small表空间size32G报错ORA-01144

    #报错现象 #创建Oracle数据库11g默认标准块大小8K,直接分配32g报错 create tablespace ceshi datafile '+data' size 32g * ERROR a ...

  7. MMON进程手工启动

    手工启动MMON进程 1. 故障现象 #某帅哥接到业务人员反映系统缓慢,RAC环境 #生成AWR报告发现节点1没有数据 #查询快照视图,发现只有节点1没有快照记录,节点2正常存在快照记录 SYS &g ...

  8. maven工程的多环境配置方案(profile)

    前言: 写一篇水文来打发下时间吧^_^. 在应用开发中, 总会遇到开发/测试/预发布/线上环境, 其环境不同, 其具体的配置项也有所不同, 因此如何快速的切换各个环境配置, 进行打包配置, 成了一个小 ...

  9. [LeetCode&Python] Problem 226. Invert Binary Tree

    Invert a binary tree. Example: Input: 4 / \ 2 7 / \ / \ 1 3 6 9 Output: 4 / \ 7 2 / \ / \ 9 6 3 1 Tr ...

  10. Linux 服务器配置、运行、不用敲命令(新手必备!) - 宝塔全攻略建站一条龙

    Linux 服务器配置.运行.不用敲命令 WordPress 建站攻略 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整 ...