例如:
short a = 10;
int b = a & 0xffff;
同样,如果我想从int
转换为short
,我该如何使用按位运算符?我不想使用(short)
使用常规的投射。
答案 0 :(得分:1)
如果您想要签名扩展名:
int b = a;
如果不这样做(即a
的负值将产生(奇怪的)b
的正值
// note that Standard Conversion of shorts to int happens before &
int b = a & std::numeric_limits<unsigned short>::max();
答案 1 :(得分:1)
对签名类型执行位操作可能不是一个好主意,并导致令人惊讶的结果:Are the results of bitwise operations on signed integers defined?。为什么需要位操作?
short int2short(int x) {
if (x > std::numeric_limits<short>::max()) {
// what to do now? Throw exception, return default value ...
}
else if (x < std::numeric_limits<short>::min()) {
// what to do now? Throw exception, return default value ...
} else
{
return static_cast<short>(x);
}
}
这可以概括为模板方法,并且还有针对错误情况的策略。
答案 2 :(得分:0)
为什么不使用(short)
?这是最简单的方法,可以得到你想要的东西。
除非它是一个面试问题,否则你需要假设一个short和一个int包含多少位。如果数字为正数,则只使用按位AND。如果数字为负数,则将其翻转为正数,然后按位AND。在AND之后,您需要将最高位更改为1.