samprat
samprat

Reputation: 2214

retrieve last 6 bits from an integer

I need to fetch last 6 bits of a integer or Uint32. For example if I have a value of 183, I need last six bits which will be 110 111 ie 55.

I have written a small piece of code, but it's not behaving as expected. Could you guys please point out where I am making a mistake?

int compress8bitTolessBit( int value_to_compress, int no_of_bits_to_compress )
{
    int ret = 0;
    while(no_of_bits_to_compress--)
    {
        std::cout << " the value of bits "<< no_of_bits_to_compress << std::endl;
        ret >>= 1;
        ret |= ( value_to_compress%2 );
        value_to_compress /= 2;
    }
    return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int val = compress8bitTolessBit( 183, 5 );

    std::cout <<" the value is "<< val << std::endl;
      system("pause>nul");
    return 0;
}

Upvotes: 3

Views: 11922

Answers (5)

devil_io
devil_io

Reputation: 191

The last k bits of an integer A.

1. A % (1<<k); // simply A % 2^k
2. A - ((A>>k)<<k); 

The first method uses the fact that the last k bits is what is trimmed after doing k right shits(divide by 2^k).

Upvotes: 1

Jack
Jack

Reputation: 133609

I don't get the problem, can't you just use bitwise operators? Eg

u32 trimmed = value & 0x3F;

This will keep just the 6 least significant bits by using the bitwise AND operator.

Upvotes: 7

tenfour
tenfour

Reputation: 36896

You have entered the realm of binary arithmetic. C++ has built-in operators for this kind of thing. The act of "getting certain bits" of an integer is done with an "AND" binary operator.

    0101 0101
AND 0000 1111
    ---------
    0000 0101

In C++ this is:

int n = 0x55 & 0xF;
// n = 0x5

So to get the right-most 6 bits,

int n = original_value & 0x3F;

And to get the right-most N bits,

int n = original_value & ((1 << N) - 1);

Here is more information on

Upvotes: 17

perreal
perreal

Reputation: 98088

int value = input & ((1 << (no_of_bits_to_compress + 1) - 1)

This one calculates the (n+1)th power of two: 1 << (no_of_bits_to_compress + 1) and subtracts 1 to get a mask with all n bits set.

Upvotes: 2

Luchian Grigore
Luchian Grigore

Reputation: 258618

tl;dr:

int val = x & 0x3F;

Upvotes: 2

Related Questions