gpt4 book ai didi

有人可以解释这段代码 - rtc 按位翻转(在 c 中)吗?

转载 作者:太空狗 更新时间:2023-10-29 16:02:23 25 4
gpt4 key购买 nike

谁能解释一下 ((~(preRtcInseconds <<1)+1)>>1)

unsigned long preInseconds;
unsigned long curInSeconds;
unsigned long elapsedInSeconds;

if(curInSeconds>=preInseconds)
{
elapsedInSeconds = curInSeconds - preInseconds;//does easy thing. no needs roll over
}
else{ //rollover
preInseconds = ((~(preInseconds <<1)+1)>>1);
elapsedInSeconds = curInSeconds + preInseconds;
}

最佳答案

unsigned long 的宽度是w .那么最大值为unsigned long可以容纳的是

ULONG_MAX = 2^w - 1

preInseconds = a + b , 其中

a = preInseconds & (1ul << (w-1))
b = preInseconds & ((1ul << (w-1)) - 1)

a是 0 或 2^(w-1) ,取决于是否preInseconds >= 2^(w-1) .然后初始左移消灭a , 所以

preInseconds << 1

给出 b << 12*b .

然后取按位补码,

~(b << 1)

给出 ULONG_MAX - (b << 1) .

如果b == 0 , 加 1 到 ULONG_MAX - (b << 1)结果为 0,否则

~(b << 1) + 1

给予

2^w - (b << 1)

如果 b == 0,则右移一位产生 0和

2^(w-1) - b

否则。因此

preInseconds = ((~(preInseconds <<1)+1)>>1);

preInseconds

2^(w-1) - b

如果b != 0 , 如果 b == 0 则为 0 .

最后,

elapsedInSeconds = curInSeconds + preInseconds;

因此设置 elapsedInSecondscurInSeconds 的值如果preInseconds2^(w-1) [如果else分支被占用,preInseconds > curInSeconds , 所以它不是 0] 和 to

curInSeconds - (preInseconds & (ULONG_MAX >> 1)) + 2^(w-1)

否则。

我不确定该操作的目的是什么。对于 preInseconds > curInSeconds , 计算

curInSeconds - preInseconds

会导致

(2^w - preInseconds) + curInSeconds

这与(数学上)相同

(2^w + curInSeconds) - preInseconds

如果 curInSeconds 这将是耗时自上次以来计数器一次滚动preInseconds被采用,如果当前计数器值小于前一个值,则可能会发生这种情况。这是有道理的。

在 else 分支完成体操后,

  • 如果preInseconds <= 2^(w-1) , elapsedInSeconds变成 curInSeconds - preInseconds + 2^(w-1) , 翻转的当前计数器与前一个计数器之间的差值减去 2^(w-1)
  • 如果preInseconds > 2^(w-1) , 自 x - 2^(w-1) == x + 2^(w-1)在无符号算术中,我们得到与 curInSeconds - preInSeconds 相同的结果.

所以,假设 curInSeconds翻转一次,它计算前一个事件和当前事件之间经过的秒数,除非发生翻转 2^(w-1)或前一个事件后的更多秒,在这种情况下 2^(w-1)从实际耗时中减去秒数。

关于有人可以解释这段代码 - rtc 按位翻转(在 c 中)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13960560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com