c get nth byte of integer
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.
Kamran224
Updated on July 09, 2022Comments
-
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 over 12 yearsYou'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 over 12 yearsTry the other bit-shift operator.
-
Thanatos over 12 yearsBear 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 over 12 yearsPlease use parentheses! I can never member whether
>>
or*
has higher precedence. -
HoseinGhanbari over 6 yearsIf 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 over 6 years@HoseinGhanbari Same way, but find the
(n % sizeof(int))
-th byte of the(n / sizeof(int))
-th array element. -
Brian Peterson almost 5 yearsWhy doesn't this cause weirdness because of an arithmetic right shift? I know that it doesn't, I just don't understand why.
-
Toothless204 almost 4 yearsStandard C does not have a type named
byte
, could you be referring to either auint8_t
from C99 orunsigned char
? -
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