C# Language: Changing the First Four Bits in a Byte

后端 未结 9 1621
南旧
南旧 2021-02-14 07:23

In order to utilize a byte to its fullest potential, I\'m attempting to store two unique values into a byte: one in the first four bits and another in the second four bits. How

相关标签:
9条回答
  • 2021-02-14 07:42

    I know you asked specifically about clearing out the first four bits, which has been answered several times, but I wanted to point out that if you have two values <= decimal 15, you can combine them into 8 bits simply with this:

        public int setBits(int upperFour, int lowerFour)
        {
            return upperFour << 4 | lowerFour;            
        }
    

    The result will be xxxxyyyy where

    xxxx = upperFour
    yyyy = lowerFour
    

    And that is what you seem to be trying to do.

    0 讨论(0)
  • 2021-02-14 07:48
    public int SplatBit(int Reg, int Val, int ValLen, int Pos)
    {
        int mask = ((1 << ValLen) - 1) << Pos;
        int newv = Val << Pos;
        int res = (Reg & ~mask) | newv;
        return res;            
    }
    

    Example:

    • Reg = 135
    • Val = 9 (ValLen = 4, because 9 = 1001)
    • Pos = 2

    • 135 = 10000111

    • 9 = 1001
    • 9 << Pos = 100100
    • Result = 10100111
    0 讨论(0)
  • 2021-02-14 07:52

    I'm not really sure what your method there is supposed to do, but here are some methods for you:

    void setHigh(ref byte b, byte val) {
        b = (b & 0xf) | (val << 4);
    }
    
    byte high(byte b) {
        return (b & 0xf0) >> 4;
    }
    
    void setLow(ref byte b, byte val) {
        b = (b & 0xf0) | val;
    }
    
    byte low(byte b) {
        return b & 0xf;
    }
    

    Should be self-explanatory.

    0 讨论(0)
  • 2021-02-14 07:52

    A quick look would indicate that a bitwise and can be achieved using the & operator. So to remove the first four bytes you should be able to do:

    byte value1=255; //11111111
    byte value2=15; //00001111
    
    return value1&value2;
    
    0 讨论(0)
  • 2021-02-14 07:54

    When I have to do bit-twiddling like this, I make a readonly struct to do it for me. A four-bit integer is called nybble, of course:

    struct TwoNybbles
    {
        private readonly byte b;
        public byte High { get { return (byte)(b >> 4); } }
        public byte Low { get { return (byte)(b & 0x0F); } {
        public TwoNybbles(byte high, byte low)
        {
            this.b = (byte)((high << 4) | (low & 0x0F));
        }
    

    And then add implicit conversions between TwoNybbles and byte. Now you can just treat any byte as having a High and Low byte without putting all that ugly bit twiddling in your mainline code.

    0 讨论(0)
  • 2021-02-14 07:56

    You first mask out you the high four bytes using value & 0xF. Then you shift the new bits to the high four bits using newFirstFour << 4 and finally you combine them together using binary or.

    public void changeHighFourBits(byte newHighFour)
    {
        value=(byte)( (value & 0x0F) | (newFirstFour << 4));
    }
    
    public void changeLowFourBits(byte newLowFour)
    {
        value=(byte)( (value & 0xF0) | newLowFour);
    }
    
    0 讨论(0)
提交回复
热议问题