【发布时间】:2017-04-06 20:21:39
【问题描述】:
我需要获取某个整数的最低 31 位,它大于标准的 32 位 int。
从大整数的最低 31 位获得一个 32 位 int,或者从大整数中获得一个填充的字节数组就足够了。
在 c# 中我会使用 BigInt 和 .toByteArray - c++11 中是否有类似的东西(我是 c++ 中的菜鸟)?
【问题讨论】:
我需要获取某个整数的最低 31 位,它大于标准的 32 位 int。
从大整数的最低 31 位获得一个 32 位 int,或者从大整数中获得一个填充的字节数组就足够了。
在 c# 中我会使用 BigInt 和 .toByteArray - c++11 中是否有类似的东西(我是 c++ 中的菜鸟)?
【问题讨论】:
屏蔽最低 31 位并返回结果:
template<typename T>
T mask31(T x) {
static_assert(std::is_integral<T>::value, "mask31 is only supported on integers!");
return x & (T)0x7fffffff;
}
如果您知道您正在使用的类型,您当然可以取消模板 goop 并直接内联屏蔽 :-)
【讨论】:
假设你有一个长变量中的值,你可以在一个 4 字节数组中获得你想要的 31 位,代码如下:
#include <stdint.h>
#include <stdio.h>
int main(){
long int lvalue = 0x1234567890abcdefL;
unsigned char byteArray[4];
*(int32_t *)byteArray = (int32_t)(lvalue & 0x7fffffffL); // 0x10abcdef
for(int i=0; i<4; i++)
printf("Byte[%d] = %02X\n", i, byteArray[i]);
return 0;
}
当然,字节顺序取决于您的系统。
【讨论】: