## How to "reverse" a byte?

New to FreeBASIC? Post your questions here.
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### How to "reverse" a byte?

Hi people!

I want to know a fast way (if any) to go from for example:

00111011 to 11011100

in decimal (consider up numbers as UByte): from 220 to 59

Thanks!
Tourist Trap
Posts: 2958
Joined: Jun 02, 2015 16:24

### Re: How to "reverse" a byte?

The operator NOT maybe?
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### Re: How to "reverse" a byte?

Tourist Trap wrote:The operator NOT maybe?

Mmm, Not 220 = 35 = 11000100 <> 11011100 = 59

My need is to transform a a byte where less important bit is the lefter in "the same byte" but where the less important bit be the righter.

In other way: 12345678 in 87654321
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### Re: How to "reverse" a byte?

I think is this discussion!! :-)

http://freebasic.net/forum/viewtopic.php?t=4726
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### Re: How to "reverse" a byte?

Luis Babboni wrote:I think is this discussion!! :-)

http://freebasic.net/forum/viewtopic.php?t=4726

It seems at least in 2006 there was not a fast way to do it.
I need it in a critical part of my chess engine code so I need that it be as fast as possible.
fxm
Posts: 10046
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

### Re: How to "reverse" a byte?

- For Byte:

Code: Select all

`Function reverseByte (Byval b As Byte) As Byte  Dim As String * 8 s = Str(Bin(b, 8))  For I As Integer = 0 To 3    Swap s[I], s[7-I]  Next I  Return Val("&b" & s)End Function`

- For Ubyte:

Code: Select all

`Function reverseUbyte (Byval b As Ubyte) As Ubyte  Dim As String * 8 s = Str(Bin(b, 8))  For I As Integer = 0 To 3    Swap s[I], s[7-I]  Next I  Return Val("&b" & s)End Function`
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### Re: How to "reverse" a byte?

Thanks fxm!

But the target is to avoid loops.
Try to use bits operators.

for axample, for posible moves for the rook to left being the 8 occuped squares the 1s and 0s the free squares of the first byte and the 1 the position of the rook in the 2nd byte:

a: 11000101
b: 00000100

This simple operation: a Xor (a - 2*b) gives: 01111000 that is the desired result but for the opposite side I need to do (a´ Xor (a´ - 2*b´))´ being " ´ " the "swap" I talking.
https://chessprogramming.wikispaces.com ... ce+Attacks
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### Re: How to "reverse" a byte?

Luis Babboni wrote:...
for the opposite side I need to do (a´ Xor (a´ - 2*b´))´ being " ´ " the "swap" I talking.
...

Is the same like the other but "rotating the paper 180º".
fxm
Posts: 10046
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

### Re: How to "reverse" a byte?

You can also use a static internal lookup table that is built by opportunity on each new value (to avoid a long dead time of full initialization):

Code: Select all

`Function reverseUbyte (Byval b As Ubyte) As Ubyte  Static As Ubyte table(0 To 255)  If b > 0 Andalso table(b) = 0 Then    Dim As String * 8 s = Str(Bin(b, 8))    For I As Integer = 0 To 3      Swap s[I], s[7-I]    Next I    table(b) = Val("&b" & s)  End if  Return table(b)End Function`
MrSwiss
Posts: 3657
Joined: Jun 02, 2013 9:27
Location: Switzerland

### Re: How to "reverse" a byte?

@fxm,

great stuff, as usual.
A lil' speed could be gained, by using UInteger (instead of Integer) as Loop-Counter.
(no sign checking needed)
grindstone
Posts: 767
Joined: May 05, 2015 5:35
Location: Germany

### Re: How to "reverse" a byte?

With 8 bits there are only 256 capabilities, so it would take a time next to none to initialize such a table once at the start of the program. In return you could avoid the If b > 0 Andalso table(b) = 0 Then at every access (you don't even need a Function):

Code: Select all

`Dim Shared As String tableDim As UByte reversetable = String(256,Chr(0)) 'allocate the memory and fill with "0"s'initialize the tableFor x As Integer = 0 To 255   For y As Integer = 0 To 7      If Bit(x,y) Then         table[x] = BitSet(table[x],7 - y)      EndIf   NextNext'test printFor x As Integer = 0 To 255   reverse = table[x] 'get the reverse byte   Print x, Bin(x,8), Bin(reverse,8)NextSleep`
Luis Babboni
Posts: 303
Joined: Mar 15, 2015 12:41

### Re: How to "reverse" a byte?

Thanks to all!!

I like grindstone suggestion!
I´ll comment as soon as I work on it! :-)
fxm
Posts: 10046
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

### Re: How to "reverse" a byte?

Good.
I forgot the keyword BitSet!
greenink
Posts: 200
Joined: Jan 28, 2016 15:45

### Re: How to "reverse" a byte?

The book here has many delightful bit hacks:
http://www.jjj.de/fxt/
MrSwiss
Posts: 3657
Joined: Jun 02, 2013 9:27
Location: Switzerland

### Re: How to "reverse" a byte?

I also like grindstone's approach.
But, I don't see the reason for a String ...

Re-coded to use a UByte Array, added a Macro and using UInteger's as Loop-Counters:

Code: Select all

`Dim As UByte table(255), reverse#Define invByte(b)  ( table(b) )'initialize the tableFor x As UInteger = 0 To 255    For y As UInteger = 0 To 7        If Bit(x, y) Then            table(x) = BitSet(table(x), 7 - y)        Else            table(x) = BitReset(table(x), 7 - y)        EndIf    NextNext'test printFor x As UInteger = 0 To 255    reverse = invByte(x) 'get the reverse byte    Print x, Bin(x, 8), Bin(reverse, 8)NextSleep`