0

I have a function that returns the bits of a short (inspired from Converting integer to a bit representation):

bool* bitsToShort(short value) {
    bool* bits = new bool[15];
    int count = 0;
    while(value) {
        if (value&1)
            bits[count] = 1;
        else
            bits[count] = 0;
        value>>=1;
        count++;
    }
    return bits;
}

How can I do the reverse? Converte the array of bits in the short?

8
  • With some bit/bitwise operators. Not sure if there's a better way/stdfunction Commented Dec 6, 2013 at 22:37
  • 1
    An implementation with 15-bit shorts does not conform to either the C or the C++ language definition. And even if it's changed to 16, that's a bad assumption to make without checking for overflow. Of course, that has nothing to do with the question. <g> Commented Dec 6, 2013 at 22:37
  • @PeteBecker An implementation where short has 15 value bits plus one sign bit does conform, and the code already doesn't deal with negative values properly (perhaps it doesn't need to) for other reasons, so if you ignore the sign bit, 15 bits remain. Commented Dec 6, 2013 at 22:45
  • 1
    @hvd - good point. The assumptions, then, are that value is non-negative and less than 2^16. Commented Dec 6, 2013 at 22:46
  • @PeteBecker Right, I can see that my comment wasn't very clear, but you got what I meant. Commented Dec 6, 2013 at 22:51

3 Answers 3

2
short shortFromBits(bool* bits) {
    short res = 0;
    for (int i = 0; i < 15; ++i) {
        if (bits[i]) {
            res |= 1 << i;
        }
    }
    return res;
}

res |= (1<<i) sets the i-th bit in res to one.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks I'll accept the answer, but just one more question: why is not 40000 work? give me back 7232.
Because 40000 is larger than a short. (40000 & 0x7FFF) == 7232.
1

Like this:

bool* bits = ... // some bits here
short res = 0;
for (int i = 14 ; i >= 0 ; i--) {
    res <<= 1;             // Shift left unconditionally
    if (bits[i]) res |= 1; // OR in a 1 into LSB when bits[i] is set
}
return res;

1 Comment

In the code given, bits[0] is the LSB; in your code, bits[0] would be the MSB. Downvoted (sorry about that).
-1

Essentially:

unsigned short value = 0;
for (int i = sizeof(unsigned short) * CHAR_BIT - 1; 0 <= i; --i) {
    value *= 2;
    if (bits[i)
        ++value;
}

This assumes that bits points to an array of bool with at least sizeof(unsigned short) elements. I have not tested it. There could be an off-by-one error somewhere. But maybe not.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.