我怎么能位反映了德尔福的一个字节? [英] How can I bit-reflect a byte in Delphi?

查看:67
本文介绍了我怎么能位反映了德尔福的一个字节?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个简单的方法来位反映在Delphi中一个字节变量,从而使最显著位(MSB)得到至少显著位(LSB),反之亦然?

Is there an easy way to bit-reflect a byte variable in Delphi so that the most significant bit (MSB) gets the least significant bit (LSB) and vice versa?

推荐答案

在code你可以做这样的:

In code you can do it like this:

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字节的存储器。

But a lookup table would be much more efficient, and only consume 256 bytes of memory.

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;

这是比个人的位操作code的版本快10倍以上。

This is more than 10 times faster than the version of the code that operates on individual bits.

最后,我通常不喜欢太消极的接受的答案发表评论时,我有一个竞争性的答案。在这种情况下,是非常严重的问题,你接受了,我想清楚你和还规定任何未来的读者的答案。

Finally, I don't normally like to comment too negatively on accepted answers when I have a competing answer. In this case there are very serious problems with the answer that you accepted that I would like to state clearly for you and also for any future readers.

您接受@亚略当时的答案时,它包含在同一帕斯卡尔code作为在这个答案有两个版本的汇编中可以看出,在一起。事实证明,那些汇编版本比帕斯卡版本要慢得多。他们是慢一倍的帕斯卡尔code。

You accepted @Arioch's answer at the time when it contained the same Pascal code as can be seen in this answer, together with two assembler versions. It turns out that those assembler versions are much slower than the Pascal version. They are twice as slow as the Pascal code.

这是一种常见的谬论转换高位code到汇编更快code的结果。如果你这样做很糟糕,那么你可以很容易地生产出运行速度比由编译器发出的code更慢code。有些时候,这是值得书写的汇编code,但你不能永远这样做没有适当的基准。

It is a common fallacy that converting high level code to assembler results in faster code. If you do it badly then you can easily produce code that runs more slowly than the code emitted by the compiler. There are times when it is worth writing code in assembler but you must not ever do so without proper benchmarking.

这是特别严重的关于使用汇编这里是,它是如此明显,基于表格的解决方案将是极其快。很难想象怎么会在得到显著改善。

What is particularly egregious about the use of assembler here is that it is so obvious that the table based solution will be exceedingly fast. It's hard to imagine how that could be significantly improved upon.

这篇关于我怎么能位反映了德尔福的一个字节?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆