c get nth byte of integer

86,918

Solution 1

int x = (number >> (8*n)) & 0xff;

where n is 0 for the first byte, 1 for the second byte, etc.

Solution 2

For the (n+1)th byte in whatever order they appear in memory (which is also least- to most- significant on little-endian machines like x86):

int x = ((unsigned char *)(&number))[n];

For the (n+1)th byte from least to most significant on big-endian machines:

int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n];

For the (n+1)th byte from least to most significant (any endian):

int x = ((unsigned int)number >> (n << 3)) & 0xff;

Of course, these all assume that n < sizeof(int), and that number is an int.

Solution 3

int nth = (number >> (n * 8)) & 0xFF;

Carry it into the lowest byte and take it in the "familiar" manner.

Solution 4

If you are wanting a byte, wouldn't the better solution be:

byte x = (byte)(number >> (8 * n));

This way, you are returning and dealing with a byte instead of an int, so we are using less memory, and we don't have to do the binary and operation & 0xff just to mask the result down to a byte. I also saw that the person asking the question used an int in their example, but that doesn't make it right.

I know this question was asked a long time ago, but I just ran into this problem, and I think that this is a better solution regardless.

Share:
86,918
Kamran224
Author by

Kamran224

Updated on July 09, 2022

Comments

  • Kamran224
    Kamran224 almost 2 years

    I know you can get the first byte by using

    int x = number & ((1<<8)-1);
    

    or

    int x = number & 0xFF;
    

    But I don't know how to get the nth byte of an integer. For example, 1234 is 00000000 00000000 00000100 11010010 as 32bit integer How can I get all of those bytes? first one would be 210, second would be 4 and the last two would be 0.

    • Greg Hewgill
      Greg Hewgill over 12 years
      You're already using the bit shift operator << in your example. How could you use the shift operator to get different bits out of your number?
    • Alex S
      Alex S over 12 years
      Try the other bit-shift operator.
    • Thanatos
      Thanatos over 12 years
      Bear in mind that the "first byte" — as you've used it here — may not be the first byte in memory. Your example, 1234, may very easily be 11010010 at the lowest address, and, 00000000 at the highest address.
  • Greg Hewgill
    Greg Hewgill over 12 years
    Please use parentheses! I can never member whether >> or * has higher precedence.
  • HoseinGhanbari
    HoseinGhanbari over 6 years
    If we have an array of int, How will the answer change? I mean how can I get the nth byte's value from the beginning of an int array ?
  • Dmitri
    Dmitri over 6 years
    @HoseinGhanbari Same way, but find the (n % sizeof(int))-th byte of the (n / sizeof(int))-th array element.
  • Brian Peterson
    Brian Peterson almost 5 years
    Why doesn't this cause weirdness because of an arithmetic right shift? I know that it doesn't, I just don't understand why.
  • Toothless204
    Toothless204 almost 4 years
    Standard C does not have a type named byte, could you be referring to either a uint8_t from C99 or unsigned char?
  • FlexEast
    FlexEast almost 2 years
    @BrianPeterson The number gets shifted to the right so that the byte you want is in the rightmost position, and then it gets masked with the & 0xff, which outputs a one in any spot where both numbers have ones. For example n = 0000 0000 1011 0101 0xff = 0000 0000 0000 1111 n & 0xff = 0000 0000 0000 0101