在 Delphi 中如何位反映一个字节?

2024-02-08

在Delphi中是否有一种简单的方法来位反映字节变量,以便最高有效位(MSB)获得最低有效位(LSB),反之亦然?


在代码中你可以这样做:

function ReverseBits(b: Byte): Byte;
var 
  i: Integer;
begin
  Result := 0;
  for i := 1 to 8 do
  begin
    Result := (Result shl 1) or (b and 1);
    b := b shr 1;
  end;
end;

但查找表会更有效,并且只消耗 256 字节的内存。

function ReverseBits(b: Byte): Byte; inline;
const
  Table: array [Byte] of Byte = (
    0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,
    8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,
    4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,
    12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,
    2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,
    10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,
    6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,
    14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,
    1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,
    9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,
    5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,
    13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,
    3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243,
    11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,
    7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,
    15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255
  );
begin
  Result := Table[b];
end;

这比对单个位进行操作的代码版本快 10 倍以上。


最后,当我有一个竞争性的答案时,我通常不喜欢对已接受的答案做出过于负面的评论。在这种情况下,您接受的答案存在非常严重的问题,我想为您和任何未来的读者明确说明。

您当时接受了 @Arioch 的答案,因为它包含与此答案中所示相同的 Pascal 代码以及两个汇编程序版本。事实证明,这些汇编程序版本比 Pascal 版本慢得多。它们的速度是 Pascal 代码的两倍。

将高级代码转换为汇编程序会产生更快的代码,这是一个常见的谬论。如果你做得不好,那么你很容易生成比编译器发出的代码运行得更慢的代码。有时,值得用汇编程序编写代码,但在没有适当的基准测试的情况下绝对不能这样做。

这里使用汇编程序的特别令人震惊的是,很明显基于表的解决方案将非常快。很难想象如何能够显着改进这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Delphi 中如何位反映一个字节? 的相关文章

随机推荐