gpt4 book ai didi

c++ - 为什么使用 (t1-t2)>(1U<<31) 而不是纯粹的比较?

转载 作者:太空狗 更新时间:2023-10-29 21:12:27 25 4
gpt4 key购买 nike

我从旧项目中获取代码:

inline bool timer_timestamp_less(uint32_t t1,uint32_t t2){
return (t1-t2)>(1U<<31);
}

某处:

 if(!timer_timestamp_less(t1,t2)) ..

头疼之后,明白代码是等价的

if(t1>t2)...

我的前任有代码而没有咖啡馆。还是我想的太简单了?

最佳答案

不,您的重构不会在所有情况下恢复相同的结果:if(!timer_timestamp_less(t1, t2)) 几乎if(t1 > t2)相同.

最初的实现似乎依赖于表达式 t1 - t2 的明确定义的环绕行为,对于 t2 的情况,它将向最高有效位注入(inject) 1大于 t1 , 也不是 t1也不t2将该原始位设置为 1。(在后一种情况下,行为要复杂得多。)

对于 t1 的值和 t2在 [0, 231 - 1] 范围内,等效表达式实际上是 !(t1 < t2) .目前你拥有它的方式,对于 t1 的情况,表达式不同和 t2相等:

#include <iostream>
using namespace std;

inline bool timer_timestamp_less_1(uint32_t t1,uint32_t t2){
return (t1-t2)>(1U<<31);
}

inline bool timer_timestamp_less_2(uint32_t t1,uint32_t t2){
return (t1 < t2);
}

int main(){
// Equivalent
cout << !timer_timestamp_less_1(1, 2) << endl; // 0
cout << !timer_timestamp_less_2(1, 2) << endl; // 0
// Not Equivalent
cout << !timer_timestamp_less_1(-1, 2) << endl; // 0
cout << !timer_timestamp_less_2(-1, 2) << endl; // 1
}

代码:https://ideone.com/yocmS2

关于c++ - 为什么使用 (t1-t2)>(1U<<31) 而不是纯粹的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47324625/

25 4 0