PIC Microcontroller Bit Math Method

Setting bit number X

Tracy Smith says

Here are a couple of ideas for getting 1<<TestBit
10 cycles:

2^n:
    clrw
    btfsc    TestBit,2
     movlw   b'11111100'
    addwf    TestBit,f

    incf     TestBit,w
    btfsc    TestBit,1
     iorwf   TestBit,f

    incf     TestBit,f

    skpnc
     swapf   TestBit,f

.........
another way (7 cycles [including the call])

two_to_n:
    andlw    7
    addwf    pcl,f
    retlw    1
    retlw    2
    retlw    4
    retlw    8
    retlw    0x10
    retlw    0x20
    retlw    0x40
    retlw    0x80


............
or probably more to the point

    movf     portb,w
    movwf    portb_shadow

    btfss    TestBit,2
     swapf   portb_swadow,f


    btfss    TestBit,0
     rlf     portb_shadow,f

    movlw    b'10000000'
    btfss    TestBit,1
     movlw   b'00100000'

    andwf    portb_shadow,f

    skpnz
     goto    _the_bit_is_set

.lo

Kevin Blain says:

clrf    mask    ; empty the mask

; a file called bit contains the 0 to 7 value of the bit position

incf    bit    ; make it 1 to 8, so decfsz works nicely
bsf    STATUS, C    ; set the carry flag. This will be rotated in 'bit' times

loop:
rlf    mask, f
decfsz    bit, f    ; skip out after 'bit' times.
goto    loop
.....               ; rest of code...

Of course, it would be good to ensure that bit is not greater than 7 when
entering the routine.

see: http://www.infosite.com/%7Ejkeyzer/piclist/1999/Nov/0018.html