Bit Shifting, Masking or a Bit Field Struct?

前端 未结 3 1630
没有蜡笔的小新
没有蜡笔的小新 2021-01-03 05:01

I\'m new to working with bits. I\'m trying to work with an existing protocol, which can send three different types of messages.

Type 1 is a 16-bit structure:

<
3条回答
  •  长情又很酷
    2021-01-03 05:48

    You can do it with a series of shifts, ands, and ors. I have done the 10-bit index part for Type 2:

    unsigned int i = 252;
    
    analog a = (analog)(((i << 16) & 0x7f0000) | (i << 17) & 0x7000000);
    

    Essentially, what this code does is shift the 10 bits of interest in int i to the range 16 - 25, then it ands it with the bitmask 0x7f0000 to set bits 22 - 31 to zero. It also shifts another copy of the 10 bits to the range 17 - 26, then it ands it with the bitmask 0x7000000 to set bits 0 - 22 and 26 - 31 to zero. Then it ors the two values together to create your desired zero-separated value.

    .. I'm not absolutely sure that I counted the bitmasks correctly, but I hope you've got the idea. Just shift, and-mask, and or-merge.

    Edit: Method 2:

    analog a;
    a.sig1 = (i & 0x7f); // mask out bit 8 onwards
    a.sig2 = ((i<<1) & 0x700); // shift left by one, then mask out bits 0-8
    

    On second thought method 2 is more readable, so you should probably use this.

提交回复
热议问题