40

我知道你可以通过使用获得第一个字节

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

或者

int x = number & 0xFF;

但我不知道如何获取整数的第 n 个字节。例如,1234 是 00000000 00000000 00000100 11010010 作为 32 位整数我怎样才能获得所有这些字节?第一个是 210,第二个是 4,最后两个是 0。

4

4 回答 4

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

其中 n 第一个字节为 0,第二个字节为 1,以此类推。

于 2011-10-16T21:24:56.537 回答
18

对于第 (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.

于 2011-10-17T00:20:09.410 回答
4

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

将其携带到最低字节中,并以“熟悉”的方式进行。

于 2011-10-16T21:25:21.430 回答
1

如果你想要一个字节,更好的解决方案不是:

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

这样,您将返回并处理一个字节而不是一个 int,因此我们使用的内存更少,并且我们不必执行二进制和操作& 0xff来将结果屏蔽为一个字节。我还看到提出问题的人在他们的示例中使用了 int ,但这并不正确。

我知道这个问题很久以前就被问过了,但我刚刚遇到了这个问题,我认为无论如何这是一个更好的解决方案。

于 2019-06-13T22:43:10.420 回答