【问题标题】:How to remove the first 3 bytes and last one byte from s64 value?如何从 s64 值中删除前 3 个字节和最后一个字节?
【发布时间】:2014-06-29 20:04:47
【问题描述】:

代码:

s64 end_time;
struct timespec ts;
getrawmonotonic(&ts);
end_time = timespec_to_ns(&ts);

如何从end_time 中删除前三个字节和最后一个字节? 我想将它存储在 uint32 中。 有人可以告诉我该怎么做吗?

uint32 latency;
fscanf(fp, "%lu\n", latency);  //fp  is reading the end_time and storing in latency.
latency = (uint32) (latency >> 8) & 0xFFFFFFFF;

【问题讨论】:

  • 最后一个字节是指最不重要的还是最重要的?
  • 定义 'first' 和 'last' (在任何一种情况下,它们中的一个对于您的目的都无关紧要)。
  • 不要质疑答案。标记对您有帮助的答案。
  • 在您编辑的问题中,您需要将延迟定义为s64,否则您查找的数据将丢失。另外:fscanf(fp, "%lld", latency);
  • 在那之后我应该转换吗??

标签: c++ c linux types casting


【解决方案1】:

怎么样:

u32 end_time32 = (u32) (end_time >> 24) & 0xFFFFFFFF;

根据您对first 和last 字节的定义,它也可能是:

u32 end_time32 = (u32) (end_time >> 8) & 0xFFFFFFFF;

例子:

s64 end_time = 0x1234567890ABCDEF;
u32 end_time32 = (u32) (end_time >> 24) & 0xFFFFFFFF;

// end_time32 is now: 0x34567890

s64 end_time = 0x1234567890ABCDEF;
u32 end_time32 = (u32) (end_time >> 8) & 0xFFFFFFFF;

// end_time32 is now: 0x7890ABCD

编辑

更新问题后:

s64 latency;
fscanf(fp, "%lld", latency);  //fp  is reading the end_time and storing in latency.
u32 latency32 = (uint32) (latency >> 8) & 0xFFFFFFFF;

【讨论】:

  • 如果你给 & 0xFFFFFFFF 会发生什么??
  • & 是逻辑 AND 运算符。二进制中的0xFFFFFFFF 全为 1(具体为 32 个 em)。 1 和 1 产生 1。1 和 0 产生 0。所以两个值都必须为 1 才能使结果为 1。由于您要将 64 位值截断为 32 位,因此您要确保只有 32 - 结果数字中的重要信息位。 0xFFFFFFFF 确保前 32 位保留其值,其他 32 位为零。
  • @user3615655 您在问题中的新代码没有任何意义。您正在屏蔽 uint32 类型的值(这不是标准类型,但我认为它是 32 位无符号整数)。
  • 掩码 (& 0xFFFFFFFF) 仅在括号中才有意义。目前,您正在屏蔽已经转换为 uint32_t 的值,根据定义,它是 32 位大...
  • 是否可以通过 uint32 变量读取 s64 ??你能告诉我另一种选择吗??
【解决方案2】:

我假设“第一个”和“最后一个”分别是指“最重要”和“最不重要”。

也就是说,你有 8 个字节:

76543210

并希望将其映射到 4 个字节:

4321

这最容易通过移位、掩码和(截断)强制转换来完成:

const uint32_t time32 = (uint32_t) ((end_time >> 8) & 0xffffffff);

掩码很可能会被编译器优化掉,但会非常清楚发生了什么。

【讨论】:

  • 为什么要在投射前屏蔽结果?
  • @leemes 我不知道,只是很清楚发生了什么。因此我对优化的评论。
【解决方案3】:

您可以通过 位移 做到这一点。您必须将值向右移动 8 位(= 1 字节),这是使用 >> 运算符完成的:

uint32_t t = (uint32_t)(end_time >> 8);
//                               ^^
//                          bit-shifting

在下文中,字节被可视化以便更好地理解。如果值end_time由八个字节组成,符号值A B C D E F G H,你想要的是D E F G:

end_time:                     A B C D E F G H
end_time >> 8:                0 A B C D E F G
(uint32_t)(end_time >> 8):            D E F G

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2015-01-11
    • 2020-01-29
    相关资源
    最近更新 更多