Move seperate bytes into a word


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1

    Default Move seperate bytes into a word

    How can I combine these bytes into a word size variable? I am using only four bits of the bytes "0-3" and would like to place them into a word in such a way that "Z" holds A= 0-3, B= 4-7, C=8-11,and D=12-15.
    Example:

    A=%00000001
    B=%00000010
    C=%00000011
    D=%00000100

    Z=0100001100100001

    I was thinking of using Aliases in the manual but not sure if that was a way to do it.

    I really didn't want to do this:
    z.0=a.0
    z.1=a.1
    etc.
    Thanks
    Last edited by tazntex; - 11th November 2008 at 19:23.

  2. #2
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,116


    Did you find this post helpful? Yes | No

    Default

    Something like this?

    z=a+b<<4+c<<8+d<<12

    Ioannis

  3. #3


    Did you find this post helpful? Yes | No

    Default

    Thank you very much, never thought of that. I will try it out.

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    "Z" holds
    A= 0-3,
    B= 4-7,
    C=8-11,and
    D=12-15.
    First thing is to isolate each 4LSB of each variable. Easy way, using boolean AND (&)
    Code:
    A = A & $0F
    B = B & $0F
    C = C & $0F
    D = D & $0F
    Now, you need to shift some bits of your Bytes variables. This is done using left shift (<<). Check your manual about that. Knowing that, we could modify the above like
    Code:
    A = A & $0F
    B = B << 4  
    C = C & $0F
    D = D << 4
    Now you need to combine A & B, and C & D, then the whole thing together. Boolean OR do the trick
    Code:
    A = (A & $0F) | (B <<4)  ' a hold A & B
    C = (C & $0F) | (D <<4)  ' C hold C & D
    Then you need to send A and C where they're suppose to go in Z
    Code:
    Z.LowByte = A
    Z.HighByte = C
    A is now LSB of Z(0-7), C is now MSB of Z(8-15).

    This could be shorten like
    Code:
    Z.LowByte = (A & $0F) | (B <<4)  
    Z.HighByte = (C & $0F) | (D <<4)
    If you're REALLY SURE you NEVER EVER mess with bits <7:4> of your variables, then yes, this could reduce to
    Code:
    Z.HighByte = (D<<4) | C
    Z.LowByte = (B<<4) | A
    OR
    Code:
    Z = (D<<12) | (C<<8) | (B<<4) | A
    I see other ways, but this should be more than enough to start
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    One step further..
    Code:
    Z VAR WORD
    A VAR Z.LOWBYTE
    B VAR BYTE
    C VAR Z.HIGHBYTE
    D VAR BYTE
    
    '
    '    Some other code where you set A, B, C & D BYTE variables
    '
    
    Z.HIGHBYTE = Z.HIGHBYTE | (D<<4)
    Z.LOWBYTE = Z.LOWBYTE | (B<<4)
    ' Now you have everything in Z... easy huh?
    or.. yet another
    Code:
    Z = Z | (B<<4) | (D<<12)
    Enjoy
    Last edited by mister_e; - 11th November 2008 at 22:10.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  6. #6


    Did you find this post helpful? Yes | No

    Default

    I've tried Ioannis suggestion and it seems to work fine, I'll will try the others to. I do not plan to ever use bits 7-4 so I will give these a try. I am just playing around trying to see what does and does not work. I learned something new and appreciate all the help.

    Again, Many Thanks

  7. #7
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,116


    Did you find this post helpful? Yes | No

    Default

    Steve's solutions cover the case that high nibble could hold some bits at 1 and masks to zero. Mine is based on the assumption that high nibbles will always be 0.

    It would also be interesting to know which way is less memory hungry.

    Ioannis

Similar Threads

  1. Bits, Bytes Words and Arrays
    By Melanie in forum FAQ - Frequently Asked Questions
    Replies: 24
    Last Post: - 14th June 2016, 07:55
  2. Read/Write Problem
    By Tobias in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 10th February 2010, 01:51
  3. Minimizing code space
    By Tobias in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 30th May 2009, 07:25
  4. DS2760 Thermocouple Kit from Parallax in PicBasicPro
    By seanharmon in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 8th July 2008, 23:19
  5. calculation problem
    By nicolelawsc in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 31st March 2006, 15:23

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts