I am struggling with bit shift, and and or operations.
What I need are unsigned bytes and integers, but these are not avail.
Yes, I have finally discovered that there is an bit.unsignedshiftright and that bit.and(b,0xFF) does an integer cast without the leftmost bit set.
So far so good. But I am still struggling to get a few operations translated from Delphi to B4A.
Already I have put a single operation into one line, to rule out any problems with casted expressions, but still the results are partially wrong. It seems some sort of signed integer conversion is still taking place under certain conditions.
Any help is very much appreciated.
Thanks in advance
Andy
The caller sub:
Part of the called sub:
What I need are unsigned bytes and integers, but these are not avail.
Yes, I have finally discovered that there is an bit.unsignedshiftright and that bit.and(b,0xFF) does an integer cast without the leftmost bit set.
So far so good. But I am still struggling to get a few operations translated from Delphi to B4A.
Already I have put a single operation into one line, to rule out any problems with casted expressions, but still the results are partially wrong. It seems some sort of signed integer conversion is still taking place under certain conditions.
Any help is very much appreciated.
Thanks in advance
Andy
The caller sub:
B4X:
Sub parse (b() As Byte, f As TFf) As TFf
Dim i,j As Int
'This is the Delphi code - char numbering in string is correct as shown
'decode((ord(st[2]) AND $1F) shl 8 + ord(st[3]),13,f);
i=Bit.And(b(2),0xFF)
i=Bit.And(i,0x001F) 'ord(st[2]) AND $1F
i=Bit.ShiftLeft(i,8) 'shl 8
j=Bit.And(b(3),0xff)
i=Bit.Or(i,j)
i=Bit.And(i,0x1FFF) 'for whatever
f=decode(i,13,f)
Return f
End Sub
Part of the called sub:
B4X:
Sub decode(w As Int, bits As Int, f As TFf) As TFf
Dim a,b,c,d As Int
If bits=13 Then
If Bit.And(w,0x0010)=0 Then 'is always 0
Else
' Delphi code
' i:= ( (w AND $000f) OR ((w AND $0020) shr 1) OR ((w AND $1F80) shr 2) ) * 25 - 1000;
a=Bit.And(w,0x000F)
b=Bit.And(w,0x0020)
b=Bit.unsignedShiftRight(b,1)
a=Bit.Or(a,b)
b=Bit.And(w,0x1F80)
b=Bit.unsignedShiftRight(b,2)
a=Bit.Or(a,b)
a=Bit.And(a,0x07ff) 'for whatever
f.alt=a*25-1000
End If
Return f
End If
End Sub