• 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
          0: (Lo, Hi: Cardinal);
          1: (Cardinals: array [0..1] of Cardinal);
          2: (Words: array [0..3] of Word);
          3: (Bytes: array [0..7] of Byte);
      end;
    ①
    var
    n1,n2: Cardinal;
    num64: Int64;
    rec: Int64Rec;
    begin
    n1 := $44332211;
    n2 := $AABBCCDD;
    rec.Lo := n1;
    rec.Hi := n2;
    num64 := Int64(rec);
    ShowMessage(IntToHex(num64, 0)); //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:44332211; n2:AABBCCDD
    end;
     
     
     
    
    譬如有一个 Cardinal 类型的整数: 1144201745
    其十六进制的表示是: $44332211
    其二进制表示是: 01000100 00110011 00100010 00010001
    我们说 Cardinal 是 32 位的整数, 这里的位是指 "二进制的位数", 不信你数数.
    我们需要重点面对的是十六进制, 不管是几进制的数在编译成汇编代码时都是用十六进制表示, 因为它最直观;
    我们用十六进制来分析, 也是因为它的直观.
    怎么直观的? Cardinal 有 32 位, 每 8 位一个字节, 共 4 个字节;
    上面的例数分成字节就是: $44、$33、$22、$11, 这明显比二进制简洁、比十进制直观.
    其中的 $11 是最低位的字节、$44 是最高位的字节(每字节对应十六进制的两位).
    有时我们需要获取其中某个字节或某两个字节, 这虽然用位运算也不难, 但还是有了诸多函数:
    --------------------------------------------------------------------------------
    Lo //获取例数中的 $11
    Hi //获取例数中的 $22
    LoWord //获取例数中的 $2211
    HiWord //获取例数中的 $4433
    --------------------------------------------------------------------------------
    其中的 Hi 好像有点费解, 为什么获取的不是 $44 而是 $22 呢?
    这样理解吧: Hi 获取的是 Lo(获取)的上一个字节.
    HiByte 和 Hi 基本一样, 如果参数是 16 位的 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 := $44332211;
    w1 := Word(num);
    w2 := HiWord(num);
    ShowMessageFmt('w1:%x; w2:%x', [w1,w2]);//w1:2211; w2:4433
    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:11; b2:22; b3:33; b4:44
    end;
     
     
    补充 Windows
    function HResultCode(hr: HRESULT): Integer;
    begin
      Result := hr and $0000FFFF;
    end;
    function HResultFacility(hr: HRESULT): Integer;
    begin
      Result := (hr shr 16) and $00001FFF;
    end;
    function HResultSeverity(hr: HRESULT): Integer;
    begin
      Result := (hr shr 31) and $00000001;
    end;
    function MakeResult(sev, fac, code: Integer): HResult;
    begin
      Result := (sev shl 31) or (fac shl 16) 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;
    都是同一种逻辑。
    View Code

  • 相关阅读:
    IPC对象的持续性
    数据结构C++版-图
    数据结构C++版-树
    数据结构C++版-队列
    数据结构C++版-栈
    数据结构C++版-线性表
    转-二值图像连通域标记
    AdaBoost笔记之通俗易懂原理介绍
    AdaBoost笔记之原理
    C++之多态
  • 原文地址:https://www.cnblogs.com/key-ok/p/3380465.html
Copyright © 2020-2023  润新知