【发布时间】:2017-10-25 06:57:29
【问题描述】:
我从一个无符号的 48 位纳秒计数器中得到了两个值,它们可能会换行。
我需要两次的差异,以纳秒为单位。
我想我可以假设读数是在大致相同的时间进行的,所以在两个可能的答案中,我认为我可以安全地选择最小的一个。
它们都存储为uint64_t。因为我不认为我可以有 48 位类型。
我想计算它们之间的差异,作为有符号整数(大概是int64_t),考虑到包装。
例如如果我从
开始x=5
y=3
那么x-y 的结果是2,如果我同时增加x 和y,即使它们超过最大值0xffffffffffff 的顶部,也会保持不变
同样,如果 x=3,y=5,则 x-y 为 -2,并且只要 x 和 y 同时递增,就会保持这种状态。
如果我可以将x,y 声明为uint48_t,而区别为int48_t,那么我想
int48_t diff = x - y;
会起作用的。
如何使用现有的 64 位算法模拟这种行为?
(我认为任何可能运行它的计算机都将使用 2 的补码算法)
附:我可能可以解决这个问题,但我想知道是否有一个很好的标准方法来做这种事情,下一个阅读我的代码的人将能够理解。
P.P.S 另外,这段代码最终会出现在最紧凑的循环中,所以能够高效编译的东西会很好,所以如果必须有选择,速度胜过可读性。
【问题讨论】:
-
我已经很久没有处理 2 的补码了,但我认为如果你写
uint64_t diff = (x - y) & 0x0000 ffff ffff ffff那么答案将是正确的,就像你有 48 位整数一样。 -
这看起来非常合理,读起来也很好。但它总是会有 0 个最高位,那么它怎么可能是一个 -ve 值作为 int64_t 呢?
-
它不会是负数
int64_t,但是当设置最高位时,它将是负数“int48_t”。 -1 是 0xff...,所以 "int48_t" 中的 -1 将表示为 0x0000ff... 如果您想说x < 0之类的内容,这将很棘手,必须将其重写为x <= (((int64_t)-1) & 0x0000ff...). -
当然,所以现在我需要将其转换为 int64_t
-
为了澄清这个问题——x 可能在 y 之前,也可能 x 在 y 之后,而您想要一个否定的结果来表示后者? (而不是知道 x 是初始测量值,y 是最终测量值,结果应该是无符号的)。