71 lines
1.6 KiB
Plaintext
71 lines
1.6 KiB
Plaintext
' FB 1.05.0 Win64 (Note the (U)Integer type is 64 bits)
|
|
|
|
' FB doesn't have built-in logical shift right or rotation operators
|
|
' but, as they're not difficult to implement, I've done so below.
|
|
|
|
Function lsr(x As Const Integer, y As Const Integer) As Integer
|
|
Dim As UInteger z = x
|
|
Return z Shr y
|
|
End Function
|
|
|
|
Function rol(x As Const Integer, y As Const UInteger) As Integer
|
|
Dim z As Integer = x
|
|
Dim high As Integer
|
|
For i As Integer = 1 To y
|
|
high = Bit(z, 63)
|
|
For j As Integer = 62 To 0 Step -1
|
|
If Bit(z, j) Then
|
|
z = BitSet(z, j + 1)
|
|
Else
|
|
z = BitReset (z, j + 1)
|
|
End If
|
|
Next j
|
|
If high Then
|
|
z = BitSet(z, 0)
|
|
Else
|
|
z = BitReset(z, 0)
|
|
End If
|
|
Next i
|
|
Return z
|
|
End Function
|
|
|
|
Function ror(x As Const Integer, y As Const UInteger) As Integer
|
|
Dim z As Integer = x
|
|
Dim low As Integer
|
|
For i As Integer = 1 To y
|
|
low = Bit(z, 0)
|
|
For j As Integer = 1 To 63
|
|
If Bit(z, j) Then
|
|
z = BitSet(z, j - 1)
|
|
Else
|
|
z = BitReset (z, j - 1)
|
|
End If
|
|
Next j
|
|
If low Then
|
|
z = BitSet(z, 63)
|
|
Else
|
|
z = BitReset(z, 63)
|
|
End If
|
|
Next i
|
|
Return z
|
|
End Function
|
|
|
|
Sub bitwise(x As Integer, y As Integer)
|
|
Print "x = "; x
|
|
Print "y = "; y
|
|
Print "x AND y = "; x And y
|
|
Print "x OR y = "; x Or y
|
|
Print "x XOR y = "; x XOr y
|
|
Print "NOT x = "; Not x
|
|
Print "x SHL y = "; x Shl y
|
|
Print "x SHR y = "; x Shr y
|
|
Print "x LSR y = "; lsr(x, y)
|
|
Print "x ROL y = "; rol(x, y)
|
|
Print "x ROR y = "; ror(x, y)
|
|
End Sub
|
|
|
|
bitwise -15, 3
|
|
Print
|
|
Print "Press any key to quit"
|
|
Sleep
|