Page 1 of 1

Shift between bits

Posted: Sat Jul 27, 2013 9:11 pm
by eddy

Code: Select all

Procedure ShiftBetweenBits(Value, First, Last)
   Last+1
   a=(1<<First)
   b=(1<<Last)
   preserved=value & ~(b-a)
   value=(value &(b-a))<<1
   If (value & b) : value>>(Last-First) : EndIf
   ProcedureReturn value|preserved
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
   a=%0001
   For i=1 To 6
      Debug Bin(a)
      a=ShiftBetweenBits(a, 0, 2)
   Next
   Debug ""
   a=%100
   For i=1 To 10
      Debug RSet(Bin(a), 16, "0")
      a=ShiftBetweenBits(a, 2, 6)
   Next
   Debug ""
   a=%1110000111
   For i=1 To 10
      Debug RSet(Bin(a), 16, "0")
      a=ShiftBetweenBits(a, 2, 6)
   Next
CompilerEndIf 

CompilerIf #PB_Compiler_IsMainFile
   Enumeration
      #Is_User      =1
      #Is_Weak     ;=2 <----------- first bit
      #Is_Strong   ;=3 
      #Is_AllMighty;=4 <----------- last bit
      #Is_Monster  ;=5 
      
      #Iam       =1 << #Is_User
      #Weak      =1 << #Is_Weak 
      #Strong    =1 << #Is_Strong
      #AllMighty =1 << #Is_AllMighty 
      #Monster   =1 << #Is_Monster
   EndEnumeration
   
   status = #Iam | #Weak | #Monster
   For i=1 To 6
      If status & #Iam : result$="I am " : EndIf
      If status & #Weak : result$+"a weak " : EndIf
      If status & #Strong : result$+"a strong " : EndIf
      If status & #AllMighty : result$+"a allmighty " : EndIf
      If status & #Monster : result$+"Monster!" : EndIf
      Debug result$
      status=ShiftBetweenBits(status, #Is_Weak, #Is_AllMighty)
   Next
CompilerEndIf