Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板化函数中允许浮点类型的位移位_C++_Templates - Fatal编程技术网

C++ 在模板化函数中允许浮点类型的位移位

C++ 在模板化函数中允许浮点类型的位移位,c++,templates,C++,Templates,首先,我要说,我理解对浮点值执行位移位和其他位操作听起来毫无意义,也不明智。所以,超越“你为什么要做这样的事”的回答 我有一个模板化函数,它处理将各种类型序列化到二进制流或从二进制流反序列化的某些部分。为了从字节流“重新组装”多字节类型,我以通常的方式使用位移位和按位OR。也请假设我已经控制了endianness和其他类似的担忧 说到这里,我正在模板化函数中寻找一种干净的方法来可靠地将变量转换为与参数类型大小相同的整数(这样我就可以对它执行位操作);其中,该参数类型可能是浮点或任何其他任意非整数

首先,我要说,我理解对浮点值执行位移位和其他位操作听起来毫无意义,也不明智。所以,超越“你为什么要做这样的事”的回答

我有一个模板化函数,它处理将各种类型序列化到二进制流或从二进制流反序列化的某些部分。为了从字节流“重新组装”多字节类型,我以通常的方式使用位移位和按位OR。也请假设我已经控制了endianness和其他类似的担忧

说到这里,我正在模板化函数中寻找一种干净的方法来可靠地将变量转换为与参数类型大小相同的整数(这样我就可以对它执行位操作);其中,该参数类型可能是浮点或任何其他任意非整数类型。伪代码示例:

uint_same_size_as(U) sameSizeInt;
其中,当
U
类型为
float
时,与(U)相同大小的
uint\U将计算为
uint32\U t
,或者当
U
类型为
double
时,将计算为
uint64\U t
,等等

有这样的动物吗?如果这是我所不知道的模板的一个基本特性,请原谅。

因为,即使您意识到代码会导致UB。更好的方法是将变量的地址强制转换为
[unsigned]char*
,并根据endianess正向或反向复制。现在还不清楚为什么你们需要一种复杂的方式来实现这一点


虽然您可以在模板中使用
std::bitset
,但我强烈怀疑简单地复制和移位位是否适用于不同大小的浮动类型。

为什么需要移位位?在字节级工作简单地说,我有理由想在位级工作。。。假设我有一个32位类型,精度比我需要的高,但24位是不够的。。。我希望能够灵活地序列化/反序列化任意位长度的值序列。然后使用
unsigned char*
复制足够的字节,并在必要时对最后一个字节进行移位(我怀疑会发生这种情况)。我怀疑它对浮点数据的正确性。需要进行位移位,因为我将位作为最小的单位,而不是字节。因此,如果我有一个22位int、11位int、32位float和7位int序列化到我的二进制流中,中间没有填充(例如字节对齐),那么我显然需要位移位和位掩码。唯一具有任意长度的底层类型将是实际整数。很明显,我不会尝试传输或重构浮点或双精度浮点,但32位/64位除外。问题是构成浮点的32位可能不会在流中以字节对齐结束。@MatthewM。然后在
unsigned int
中实现打包/解包,如果底层类型更大,则在循环中实现打包/解包。按位操作应该在int上运行得最快。@Matthew M.:一个有用的老技巧是只对奇数大小的数据进行位旋转,每当数据流耗尽时,从数据流中重新填充位缓冲移位寄存器,并像对浮点和其他对齐数据一样提取原始字节。相反地,序列化程序在第一个位发出时为位缓冲区保留一个位置,然后在流中较远的已完成缓冲区中补片(一旦满)。