劈长劈长
splitting long long
如何"拆分",即long long类型,使其第一部分在var类型的long中,第二部分也在var类型的long中。
long long long_type = 0xaaaabbbbccccdddd;
和在第一个int中,我希望有long_type var的前一半(不管从哪一边),在第二个var int中有后一半。
你的问题模棱两可。这取决于你对"分裂"的定义。您可以拆分原始long long
的值表示,也可以拆分long long
的对象表示。
如果你想拆分值表示,那么你的问题甚至更加模糊,因为你的原始值是带符号的。您打算如何分割带符号的值?你期望什么样的结果?签署了吗?无符号?高阶部分有符号,低阶部分无符号?还是别的什么?
对于无符号值,它看起来如下(假设收件人类型long
具有适合您的目的的大小)
unsigned long long long_type = ...;
unsigned long hi = long_type / ULONG_MAX;
unsigned long lo = long_type;
如果要拆分对象表示,正确的方法是使用memcpy
(在这种情况下,原始值的签名不重要)
long long long_type = ...;
unsigned long hi, lo;
memcpy(&lo, &long_type, sizeof lo);
memcpy(&hi, (char *) &long_type + sizeof lo, sizeof hi);
当然,在这种情况下,哪一部分实际上是低阶的,哪一部分是高阶的将取决于平台。
我建议使用uint32_t和uint64_t或其他固定宽度类型。
然后使用位操作分割它,像
uint64_t long_type = smthng;
uint32_t high = (long_type & 0xFFFFFFFF00000000ULL) >> 32;
uint32_t low = long_type & 0xFFFFFFFF;
long a = long_type;
long b = (static_cast<unsigned long long>(long_type) >> 32);
相关文章:
- 没有找到相关文章