Несколько раз обращался к этой задаче, решения были разными:
For i=0 To 255
;;rev(i)=Val( "%"+ReverseString( RSet( Bin(i),8,"0" ) ) )
; c.a=i
; c = ((c>>1)&$55)|((c<<1)&$AA)
; c = ((c>>2)&$33)|((c<<2)&$CC)
; c = (c>>4) | (c<<4)
c = ((((i * $0802) & $22110) | ((i * $8020) & $88440)) * $10101) >> 16;
rev(i)=c
Next i
;;rev(i)=Val( "%"+ReverseString( RSet( Bin(i),8,"0" ) ) )
; c.a=i
; c = ((c>>1)&$55)|((c<<1)&$AA)
; c = ((c>>2)&$33)|((c<<2)&$CC)
; c = (c>>4) | (c<<4)
c = ((((i * $0802) & $22110) | ((i * $8020) & $88440)) * $10101) >> 16;
rev(i)=c
Next i
Другие решения описаны в "Hacker's Delight", by Henry S. Warren, Jr. In particular Ch. 7. "Rearranging Bits and Bytes".
Финальный код есть в HACKMEM.
Комментарии
Отправить комментарий