有没有一个简单的方法来反映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倍以上.
最后,当我有一个竞争的答案时,我通常不会对接受的答案发表评论.在这种情况下,有一个非常严重的问题,答案是你接受我想对你和任何未来的读者说清楚.
当它包含与本答案中可以看到的相同的Pascal代码以及两个汇编器版本时,您接受了@ Arioch的答案.事实证明,这些汇编器版本比Pascal版本慢得多.它们是Pascal代码的两倍.
将高级代码转换为汇编程序导致更快的代码是一个常见的谬误.如果你做的很糟糕,那么你可以很容易地产生比编译器发出的代码运行得更慢的代码.有时候,值得在汇编器中编写代码,但是如果没有适当的基准测试,您绝对不能这样做.
在这里使用汇编器特别令人担忧的是,显而易见的是,基于表的解决方案将非常快.很难想象如何可以显着改善.