DEATHTOUCH 发表于 2022-1-16 01:34

[Delphi]24位有符号整数类型和32位整型的高效率转换

本帖最后由 DEATHTOUCH 于 2023-3-9 00:24 编辑

24位整数看起来奇奇怪怪对吧,一般我们遇到的整数都是8、16、32、64位的
但是在有些地方依然需要用到24位整数,比如PCM编码的24位WAV音频文件
然而24位整数的运算十分不方便,一般我们把他转换到32位整数再继续运算
于是乎我在网上寻找各种算法,包括Delphi的,C++的,发现其效率并不高
所以我就自己撸了一些代码,并进行各种优化,最后利用语言特性找到了一种高效率转换方法
由于较新的Delphi和Free Pascal支持运算符重载,所以我们就利用这一特性
代码如下
type
Int24 = record
    data: array of byte;
    class operator Implicit(i32: Integer): Int24;
    class operator Implicit(i24: Int24): Integer;
end;

class operator Int24.Implicit(i32: Integer): Int24;
var
i24b3: array of byte absolute Result;
i32b3: array of byte absolute i32;
i24w: Word absolute Result;
i32w: Word absolute i32;
begin
i24w := i32w;
i24b3 := i32b3;
end;

class operator Int24.Implicit(i24: Int24): Integer;
var
i24b3: array of byte absolute i24;
i32b4: array of byte absolute Result;
i24w: Word absolute i24;
i32w: Word absolute Result;
begin
i32w := i24w;
i32b4 := i24b3;
if (i24b3 and $80 = $80) then
      i32b4 := $FF
else
      i32b4 := 0;
end;
如果有用Free Pascal的同学,可以不用record类型直接运算符重载
type
Int24 = array of byte;

operator:=(i32:Integer)i24:Int24;
var
    i24b3:array of Byte absolute i24;
    i32b3:array of Byte absolute i32;
    i24w:Word absolute i24;
    i32w:Word absolute i32;
begin
    i24w:=i32w;
    i24b3:=i32b3;
end;

operator := (i24: Int24)i32: integer;
var
    i24b3:array of Byte absolute i24;
    i32b4:array of Byte absolute i32;
    i24w:Word absolute i24;
    i32w:Word absolute i32;
begin
    i32w := i24w;
    i32b4 := i24b3;
    if (i24b3 and $80=$80) then
      i32b4 := $ff
    else
      i32b4 := 0;
end;
在这两个功能的基础上,剩下加减乘除就是简简单单的了。

有问题或者有更优算法的欢迎提出。

夫子点灯 发表于 2022-1-16 06:29

谢谢啦,辛苦啦。

冥界3大法王 发表于 2023-3-8 23:51

@DEATHTOUCH 本坛,用Delphi活的战友虽然没几位,但是出来解决问题的加一起也不少啊。
页: [1]
查看完整版本: [Delphi]24位有符号整数类型和32位整型的高效率转换