Bit-shift array

BlitzMax Forums/BlitzMax Programming/Bit-shift array

_JIM(Posted 2010) [#1]
Is there any way I could shift all the bits in an array say... to the left 23 bits?

I have an array of Longs and I need to shift it in order to match a precise position, then make a bitwise AND with another Long array.

Obviously, I'm looking for the fastest solution, not the easiest :)


Czar Flavius(Posted 2010) [#2]
Do it in C and include the code.

Also.. Longs. Ouch, that will be slow.


_JIM(Posted 2010) [#3]
Well, I was hoping that doing an AND between two long arrays would be faster than two int arraws of double length.

Still, I haven't got to the point of actually testing that, since I need the shifting first.


Czar Flavius(Posted 2010) [#4]
A long is 64-bit so won't fit into a 32-bit processor in a single instruction - it needs to fetch half, calculate half, store half, fetch the second half, you get the idea. A 32-bit Int can be in and out in a single shot.

As BlitzMax can only compile 32-bit applications, even on a 64-bit processor I think it will be slow. You should test, but I think anything to do with longs will be considerably slower than just doing more with Ints.


ImaginaryHuman(Posted 2010) [#5]
I recommend mapping the array's storage memory to an int pointer and using that to make the modifications.

e.g. something like...

local myarrayA:long[1000]
local myarrayB:long[1000]

'fill A with some data, then..

local Aint:int ptr=int ptr(varptr(myarrayA[0]))
local Bint:int ptr=int ptr(varptr(myarrayB[0]))
local b:int=Aint[0]
local c:int
for local a:int=1 tol 1998
    c=Aint[a]
    Bint[a-1]=(b Shl 23) | (c Shr 9)
    b=c
next
Bint[1999]=Aint[1999] Shl 23

Something like that


Jesse(Posted 2010) [#6]
the 32 bit processor has a way of doing 64 bit calculations but it uses two registers instead of 1 for each number edx:eax and ecx:ebx I believe(havent looked in to Assembly in years. I'm not sure what registers it uses anymore) but it does it all in 1 instruction. the reason that it's slow is that it has to load the registers and process the 4 registers and assign the result to 2 or 4 registers dependig on the type of operation it has to do also add to that the method by which the compiler deals with the code and the results.


_JIM(Posted 2010) [#7]
Well, eventually I had to give this up. I was trying to get a fast per-pixel collision checking using bit masks. However there's a point where you stop going for full speed and choose the path that's faster to implement.

So I went for checking the pixmaps themselves and it's fast enough for now.

Also, that settled longs vs ints. I'm only doing a bit-wise AND between the 2 bytes that represent the alpha component in the two pixmaps.