سؤال

Given this code which prints all the bits in an integer out:

private string getBitLiteral(bool bitVal)
{
    if (bitVal)
    {
        return ("1");
    }
    else
    {
        return ("0");
    }
}

 

    Int64 intThisHand = 127;

    for (int i = 64; i > 0; i--)
    {
        HttpContext.Current.Response.Write(
            getBitLiteral((intThisHand & (1 << i)) != 0)
        );
    }

Why does it print out:

1000000000000000000000000011111110000000000000000000000000111111

Firstly am I looper correctly as I expect the last 7 digits to be 1's

Secondly, why are there some 1's in the middle? I would expect them all to be 0 except the trailing 7 1's.

هل كانت مفيدة؟

المحلول

1 << i is a 32 bit integer an thus overflows.
I think 1l << i would fix it.
((long)1)<<i might be more readable.

Additionally you have an off-by-one error. You want to go for 63 to 0 not from 64 to 1. Since 1<<1 is 2 and not 1.

نصائح أخرى

Are you curious about why your code is broken, or are you just trying to display the number as binary?

If the latter then you can just do this rather than re-inventing the wheel:

string asBinary = Convert.ToString(intThisHand, 2);

Or, if you want to pad out all 64 digits:

string asBinary = Convert.ToString(intThisHand, 2).PadLeft(64, '0');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top