c – 哪个方法更好地获得64位整数的低32位

前端之家收集整理的这篇文章主要介绍了c – 哪个方法更好地获得64位整数的低32位前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现在一些答案他们建议使用

lower =(some_var< 32)> 32;

但是我测试并发现以下更快:

lower = some_var&为0xffffffff;

那么哪个更好?在某些情况下,前者更安全吗?

解决方法

用&更好:

>&对于有符号和无符号的some_var是可靠的,而位移正负数产生实现定义的结果:

The value of E1 >> E2 is E1 right-shifted E2 bit positions. […] If E1 has a signed type and a negative value,the resulting value is implementation-defined.

>在我所知道的每个cpu(Z80,6502C,x86,68000,UltraSparc)上,按位和AND是一个单cpu指令,需要一个时钟周期…它不太可能变慢或者占用更多字节的机器码而不是你提到的位移方法,尽管编译器可能会将其优化为按位AND.

屏蔽的一个缺点是,相对容易意外地有7或9个F,而32中的错字是显而易见的:有其他方法可以生成掩蔽值,(1LL <32)-1,或者黑客,但是优雅的uint32_t(-1). 当然,如果uint32_t和some_var uint64_t更低,你可以让转换是隐式的,所以优化器甚至不需要实现按位,AND可以在赋值之前删除,但是这可能会给你一个编译器警告,你可以沉默阿拉

uint32_t lower = static_cast<uint32_t>(some_var);

当分配给另一个uint64_t时,或掩码不适用于所有32个最低有效位时,掩码主要是有用的.

猜你在找的C&C++相关文章