Esmael
Esmael

Reputation: 69

Get, Set, Read, converts bitwise in Short type value in C#

I have a short value X:

short X=1;  //Result in binary: 0000000000000001 
  1. I need to split them into an array and set the bits (say bit 6 and 10) //Result in binary: 0000001000100001
  2. I need to convert it back to short X value.

How can I do it painlessly? Could you please help?

Upvotes: 0

Views: 1206

Answers (4)

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186813

Linq solution, terser, but probably, less readable than foreach loop:

  using System.Linq;

  ...

  short X = 1;
  var bitsToSet = new[] { 5, 9 };

  var result = X | bitsToSet.Aggregate((s, a) => s |= 1 << a);

If you insist on short add cast:

  short result = (short) (X | bitsToSet.Aggregate((s, a) => s |= 1 << a));

Upvotes: 0

Abion47
Abion47

Reputation: 24736

If what you are referring to is a very basic encryption, then perhaps using the XOR (^) operator would be better suited for your needs.

short FlipBytes(short original, params int[] bytesToSet)
{
    int key = 0;
    foreach (int b in bytesToSet)
    {
        if (b >= 0 && b < 16)
        {
            key |= 1 << b;
        }
    }

    return (short)(original ^ key);
}

This method will both set and reset the bytes that you desire. For example:

short X = 1;
short XEncrypt = FlipBytes(X, 6, 10);
short XDecrypt = FlipBytes(XEncrypt, 6, 10);

// X        = 1    , Binary = 0000000000000001
// XEncrypt = 1089 , Binary = 0000010001000001
// XDecrypt = 1    , Binary = 0000000000000001

Upvotes: 0

Gy&#246;rgy Kőszeg
Gy&#246;rgy Kőszeg

Reputation: 18023

1. Manual solution

Setting bit 6 and 10:

myValue |= (1 << 6)|(1 << 10);

Clearing bit 6 and 10:

myValue &= ~((1 << 6)|(1 << 10));

2. Use BitArray

var bits = new BitArray(16); // 16 bits
bits[5] = true;
bits[10] = true;

Convert back to short:

var raw = new byte[2];
bits.CopyTo(raw, 0);
var asShort = BitConverter.ToInt16(raw, 0);

Upvotes: 3

Akhil Srivastava
Akhil Srivastava

Reputation: 69

If you have a int value "intValue" and you want to set a specific bit at position "bitPosition", do something like:

intValue = intValue | (1 << bitPosition);

or shorter:

intValue |= 1 << bitPosition;

If you want to reset a bit (i.e, set it to zero), you can do this:

intValue &= ~(1 << bitPosition);

(The operator ~ reverses each bit in a value, thus ~(1 << bitPosition) will result in an int where every bit is 1 except the bit at the given bitPosition.)

Upvotes: 0

Related Questions