我有一个10位的有符号值。实际上,它是一个10位颜色值,我想要将其转换为int
。
这10位将被解释为在更大的int
中的带符号值,其余的位都是零。
我可以考虑以下3种方法:
#include <stdio.h>
void p(int v)
{
printf("\t%d", v);
}
int main()
{
for (int i = -2; i < 3; ++i)
{
unsigned int u = i & 0x3ff;
int v;
// method 1: test the bit
v = u;
if (u & 0x200) v = v ^ -0x400;
p(v);
// method 2: shift
v = u<<(sizeof(int)*8-10);
v >>= (sizeof(int)*8-10);
p(v);
// method 3: use sign extend
v = (signed char)(u >> 2);
v <<= 2;
v |= u;
p(v);
printf("\n");
}
return 0;
}
有没有更好的方法?在这种位操作问题上,通常有更好的方法。
感谢任何意见。
更新
添加两种方法。第一种是由 @cruz-jean 建议的位域(bit fields),第二种是编译位域后由 gcc 提出的建议。
// method 4: bit fields
struct { int v:10; } f;
f.v = u;
v = f.v;
// method 5: sign extend short
v = (signed short)(u << 6);
v >>= 6;
有趣的是,MSVC将#4编译成#2,而gcc将#4编译成#5。
方法5看起来不错。
C
还是C++
?我怀疑这个问题应该只有一个标签。 - Fred Larsonv = (u & 0x200) ? u - 0x400 : u;
- user3386109