# SnippetUseful bit functions

#### Jimmy

##### Well-known member
3rd Party Module Dev
Tutorial Author
This adds some routines that handle bits in an exact and easy way.

Cerberus:
``````Import mojo2

Function Main()
New Game
Return 0
End

Class Game Extends App

Method OnCreate()

Local value:Int = 65535
value = Shr2(value,8)        ' Logic shift right (logical shift left is the same as non-logical Shl) the possible shift-amount is 0-32, not limitted to 31
Print "Decimal:"
Print value
Print "The number of bits it contains:"
Print CountBits(value)         ' Count the set bits.
Print "Binary representation of all the bits:"
Print BinaryString(value)    ' Write the bits.
Print Dec2Hex(value)         ' "ff"
Print "Will now print the correct 32-bits and deal with the sign-bit correctly:"
Print Dec2Hex(\$ffffffff) ' Should write "ffffffff"

Return 0
End

End

Function Overflow:Int(a:Int,b:Int)
Local result:Int = 0
result = a + b
If(a > 0 And b > 0 And result < 0) Then Return -1
If(a < 0 And b < 0 And result > 0) Then Return -1
Return 0
End

Function Shr2:Int(x:Int,y:Int) ' The only missing shift instruction (>>> in JS and C++).
If y = 0 Then Return x
x = (x Shr y) & mask
Return x
End

Function Trunc:Int(number:Float)
If number > 0 Then Return Floor(number) Else Return Ceil(number)
End

Function Len:Int(s:String)
Return s.Length
End

Function Mid:String(s:String,p:Int,n:Int)
p=p-1
Return s[(p)..(p+n)]
End

Function Left:String(s:String,n:Int)
Return s[0..n]
End

Function Right:String(s:String,n:Int)
Return s[(s.Length()-n)..(s.Length())]
End

Function Chr:String(n:Int)
Return FromChar(n)
End

Function Val:Int[](s:String)
End

Function CountBits:Int(x:Int)
Local n:Int = x
Local count:Int = 0
For Local temp:Int = 0 To 31
If ( (mask & x) = mask) Then count = count + 1
Next
Return count
End

Function BinaryString:String(x:Int)
Local all:String = ""
For Local temp:Int = 31 To 0 Step -1
If (x Shr temp) & 1 Then all=all+"1" Else all=all+"0"
If temp Mod 8 = 0 Then all=all+" "
Next
Return all
End

' Another example how to make binary print
' Function Dec2Bin:String(value:Int)
'     Local base:Int = 2
'     Local m:String=""
'     Repeat
'         Local rem:Int = value Mod base
'         value =  Shr2(value,1)
'         m = Mid("0123456789abcdefghijklmnopqrstuvwxyz",rem + 1,1) + m
'     Until value = 0
'     Return m
' End

Function Dec2Hex:String(value:Int) ' No general base for now
Local base:Int = 16
Local m:String=""
Repeat
Local rem:Int = value Mod base
value =  Shr2(value,4) ' This makes it all possible to deal with all 32-bits. Correct handling of the highest signbit.
'        value = value / base ' Only Hex for now as / is problematic with bit 31
m = Mid("0123456789abcdefghijklmnopqrstuvwxyz",rem + 1,1) + m
Until value = 0
Return m
End``````

Last edited:

#### MikeHart

• 