Shift between bits

Share your advanced PureBasic knowledge/code with the community.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Shift between bits

Post 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 
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool