Ответ 1
int x = (number >> (8*n)) & 0xff;
где n равно 0 для первого байта, 1 для второго байта и т.д.
Я знаю, что вы можете получить первый байт, используя
int x = number & ((1<<8)-1);
или
int x = number & 0xFF;
Но я не знаю, как получить n-й байт целого числа. Например, 1234 является 00000000 00000000 00000100 11010010 как 32-битное целое число Как я могу получить все эти байты? первый будет 210, второй - 4, а последние два - 0.
int x = (number >> (8*n)) & 0xff;
где n равно 0 для первого байта, 1 для второго байта и т.д.
Для (n + 1) -го байта в любом порядке они появляются в памяти (что также наименее важно для маленьких компьютеров, таких как x86):
int x = ((unsigned char *)(&number))[n];
Для (n + 1) -го байта от наименее значимого на больших машинах:
int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n];
Для (n + 1) -го байта от наименьшего до самого значимого (любой конечный):
int x = ((unsigned int)number >> (n << 3)) & 0xff;
Конечно, все они предполагают, что n
< sizeof(int)
, а number
- int
.
int nth = (number >> (n * 8)) & 0xFF;
Переведите его в младший байт и возьмите его "знакомым" способом.
Если вы хотите получить байт, лучшим решением будет:
byte x = (byte)(number >> (8 * n));
Таким образом, вы возвращаете и работаете с байтом вместо int, поэтому мы используем меньше памяти, и нам не нужно делать двоичный файл и операцию & 0xff
только для того, чтобы замаскировать результат до байта. Я также видел, что человек, задающий вопрос, использовал int в своем примере, но это не делает это правильно.
Я знаю, что этот вопрос задавался очень давно, но я столкнулся с этой проблемой, и я думаю, что это лучшее решение, несмотря на это.