求二进制反序方法(50分)

  • 主题发起人 主题发起人 酷辰
  • 开始时间 开始时间

酷辰

Unregistered / Unconfirmed
GUEST, unregistred user!
已知两个字节十六进制为80,求它的二进制反序排列后的字节。
比如:80的二进制为10000000,反序后为00000001,十六进制即1,求这个的程序过程
最好用位运算
 
谁知道,帮帮忙!
 
function BSwap(x:integer):integer;overload;
begin
asm
BSWAP eax
mov Result,eax
end;
end;
function BSwap(Value: Cardinal): Cardinal;overload;
asm
BSWAP EAX
end;
 
学习
BSWAP 是字节交换
 
to qqjm:
能否麻烦您再把它转化成C代码?
 
一个思路:
写3个函数
1、取位
2、置位
3、从高位到中间 - 从低位到中间互换
 
我试试,不知道是不是你要的结果?
function reverseHex(HexValue: Integer): Integer;
var
M, I, Tmp: Integer;
begin
M := 0;
for I := 1 to 8do
begin
Tmp := (HexValue and 1) shl (8 - i);
HexValue := HexValue shr 1;
M := M or Tmp;
end;
Result := M;
end;

e.g:
A := reverseHex($AD)
则A的值为:181
 
位运算无非就是与、或、非、异或、左移、右移几种操作。
对于一个字节的逆序:
char s =0x80;
s = ((s &
0x01 )<<7 )| ((s &amp;
0x02 )<<5 )| ((s &amp;
0x04 )<<3 )| ((s &amp;
0x08 )<<1 )|
((s &amp;
0x10 )>>1 )| ((s &amp;
0x20 )>>3 )| ((s &amp;
0x40 )>>5 )| ((s &amp;
0x80 )>>7 );
两个字节的话,先求出每个字节的逆序,然后交换这两个字节就行了。
 
用循环移位指令。好像是ROL,ROR两个
 
后退
顶部