Quick Help Please ...

BlitzMax Forums/BlitzMax Programming/Quick Help Please ...

mic_pringle(Posted 2010) [#1]
Hi,

In desperate need of some help - could someone please rewrite the following C code in Blitzmax

if ( data1 & 1<<c && data2 & 1<<c )


I'm struggling with the bit shifting in Blitzmax

Thanks

-Mic


Brucey(Posted 2010) [#2]
"Shl" is Shift Left.


matibee(Posted 2010) [#3]
.. and & is & and && is And

:)

I'd use more parenthesis too, only because I'm strange like that.

if ((data1 & (1 Shl c)) And (data2 & (1 Shl c)))



Brucey(Posted 2010) [#4]
I'd use more parenthesis too

Me also.


mic_pringle(Posted 2010) [#5]
Hi,

Thanks for this.

This is what I'm trying to rewrite in it's entirety but I think I may not have it right yet as the output isn't what I expected ...

C code
for ( r = 0 ; r < 16 ; r+=2 ) {
	for ( c = 0 ; c < 8 ; c++ ) {
		if ( data[r] & 1<<c && data[r+1] & 1<<c ) vga_setcolor(2);
		else if ( data[r] & 1<<c && ! (data[r+1] & 1<<c) ) vga_setcolor(3);
		else if ( ! (data[r] & 1<<c) && data[r+1] & 1<<c ) vga_setcolor(4);
		else vga_setcolor(5);

		vga_drawpixel(x+(7-c),y+(r/2));
	}
}


Blitzmax
For r = 0 To 15 Step 2
	For c = 0 To 7
		If (bit0 & (1 Shl c)) And (bit1 & (1 Shl c)) Then
			SetColor 196, 207, 161
		ElseIf (bit0 & 1 Shl c And Not (bit1 & 1 Shl c)) Then
			SetColor 139, 149, 109
		ElseIf (Not (bit0 & 1 Shl c) And bit1 & 1 Shl c) Then 
			SetColor 77, 83, 60
		Else
			SetColor 31, 31, 31
		EndIf
		DrawRect x+(7-c), y+(r/2), 1, 1
        Next
Next

Can anyone spot any obvious mistakes ?

(Your help is greatly appreciated)

Thanks

-Mic


Zeke(Posted 2010) [#6]
For r = 0 To 15 Step 2
	bit0 = somedata[r]
	bit1 = somedata[r+1]
	For c = 0 To 7
		If (bit0 & (1 Shl c)) And (bit1 & (1 Shl c)) Then
			SetColor 196, 207, 161
		ElseIf (bit0 & 1 Shl c And Not (bit1 & 1 Shl c)) Then
			SetColor 139, 149, 109
		ElseIf (Not (bit0 & 1 Shl c) And bit1 & 1 Shl c) Then 
			SetColor 77, 83, 60
		Else
			SetColor 31, 31, 31
		EndIf
		DrawRect x+(7-c), y+(r/2), 1, 1
        Next
Next



mic_pringle(Posted 2010) [#7]
Hi

Sorry Zeke, I removed the two lines you've added from the pasted code to make it easier to read - they are in the actual code :-)

-Mic


Zeke(Posted 2010) [#8]
but in your code you say bit0 and bit1... and in c code there is data[r] and data[r+1].. how do you set your bit0 and bit1? because they are bytes.. data[r]=first BYTE and data[r+1]=second byte.. no Bits...


mic_pringle(Posted 2010) [#9]
Full code for clarity

For r = 0 To 15 Step 2
	SeekStream(bufferStream, r)
	Local bit0:Byte = ReadByte(bufferStream)
	Local bit1:Byte = ReadByte(bufferStream)
	For c = 0 To 7
		If (bit0 & (1 Shl c)) And (bit1 & (1 Shl c)) Then
			SetColor 31, 31, 31
		ElseIf (bit0 & 1 Shl c And Not (bit1 & 1 Shl c)) Then
		        SetColor 77, 83, 60
		ElseIf (Not (bit0 & 1 Shl c) And bit1 & 1 Shl c) Then 
			SetColor 139, 149, 109
		Else
			SetColor 196, 207, 161
		EndIf
		DrawRect (x+(7-c))*4, (y+(r/2))*4, 4, 4
	Next
Next



matibee(Posted 2010) [#10]
Are you actually working with bits when you use bit0 and bit1? They should probably be bytes.

Parenthesis look screwy too. I'd be happy with the first If (by "happy", I mean "confident I could predict its output") but not with the EsleIF's.


Zeke(Posted 2010) [#11]
SeekStream(bufferStream, r)

is your bad.. you are always reading from start of stream.. (r=0 to 15) then when x/y changes then again First bytes of stream)

just remove seekstream and test again...