【问题标题】:c get nth byte of integerc 获取整数的第 n 个字节
【发布时间】:2011-12-08 21:37:45
【问题描述】:

我知道你可以使用

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

int x = number & 0xFF;

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

【问题讨论】:

  • 您已经在示例中使用了位移运算符&lt;&lt;。您如何使用移位运算符从您的号码中获取不同的位?
  • 尝试其他位移运算符。
  • 请记住,“第一个字节”——正如你在这里使用的那样——可能不是内存中的第一个字节。您的示例 1234 很容易在最低地址处为 11010010,在最高地址处为 00000000

标签: c byte shift bit-shift


【解决方案1】:

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

byte x = (byte)(number &gt;&gt; (8 * n));

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

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

【讨论】:

  • 标准 C 没有名为 byte 的类型,您是指 C99 中的 uint8_t 还是 unsigned char
【解决方案2】:
int x = (number >> (8*n)) & 0xff;

第一个字节为 0,第二个字节为 1,以此类推

【讨论】:

  • 请使用括号!我永远无法知道&gt;&gt;* 是否具有更高的优先级。
  • 为什么这不会因为算术右移而导致奇怪?我知道它没有,我只是不明白为什么。
【解决方案3】:

对于第 (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),并且numberint

【讨论】:

  • 如果我们有一个int数组,答案会如何变化?我的意思是如何从 int 数组的开头获取第 n 个字节的值?
  • @HoseinGhanbari 方法相同,但找到(n / sizeof(int))-th 数组元素的(n % sizeof(int))-th 字节。
【解决方案4】:

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

把它带入最低字节,以“熟悉”的方式取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 2023-03-09
    • 2015-07-13
    • 1970-01-01
    • 2015-09-20
    • 2011-01-25
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多